Вопрос

Я использую реализацию C# Mersenne Twister, которую я скачал ЦЕНТРЕРСКИЙ. Анкет У меня есть две проблемы с этим:

  1. Независимо от того, как я заселяю алгоритм, он не проходит Несгибаемые испытания, и под этим я имею в виду, я получаю довольно много 1 и 0 с. Кроме того, мой Kstest на 269 P-значениях-0. Ну, я не могу интерпретировать значение p, но я думаю, что несколько 1 и 0 в результате-плохие новости.
  2. Меня попросили визуально показать случайность чисел. Таким образом, я планирую цифры по мере их создания, и это вообще не кажется случайным. Вот два скриншота результата Через несколько секунд а также Через несколько секунд. Анкет Как вы можете видеть во втором скриншоте, числа падают на некоторые параллельные линии. Я пробовал разные алгоритмы, чтобы отобразить номера с точками. Все они приводят к параллельным линиям, но с разными углами! Вот как я наметил числа с точками для этих скриншотов: new Point(number % _canvasWidth, number % _canvasHeight). Анкет Как вы можете догадаться, визуальный результат зависит от ширины и высоты формы, и Это катастрофический результат.

Вот несколько способов, которыми я попытался заселить алгоритм:

  1. Пользовательская запись. Я ввожу несколько чисел, чтобы заселить алгоритм как массив Int.
  2. Случайные числа, сгенерированные самим алгоритмом !!
  3. Массив new Guid().GetHashCode()

Что мне здесь не хватает? Как мне заселить алгоритм? Как я могу заставить его пройти на несгибаемость?

Это было полезно?

Решение

Хотя я не могу поговорить с вашей первой точкой, вторая проблема связана с тем, как вы вычисляете точки, которые нужно нарисовать. Конкретно,

x = number % _canvasWidth;
y = number % _canvasHeight;

Даст вам «шаблон», который несколько соответствует соотношению сторон окна, на которое вы рисуете. Например, если _canvasWidth а также _canvasHeight были равны, вы всегда бы нарисовали на одну диагональную линию как x а также y всегда будет одинаковым. Это графическое представление не будет подходящим в этом случае.

Как насчет того, чтобы взять n битов вывода RNG и использования половины для координаты X, а другая половина для координаты Y? Для тех битов, которые выпадают из границ вашего окна, вы можете рассмотреть два варианта:

  1. Не нарисуйте их (или не нарисуйте за кадром)
  2. Выполните линейную интерполяцию, чтобы отобразить диапазон битов по ширине/высоте вашего окна

Любой вариант должен дать вам более репрезентативную картину битов, которые вы получаете из нашего генератора случайных чисел. Удачи!

Другие советы

Ваша проблема с подсветкой точки должна легко исправить, генерируя новое случайное число для каждого из координат X и Y. Попытка повторного использования одного сгенерированного числа для X и Y - это в основном преждевременная оптимизация, но если вы пойдете по этому пути, убедитесь, что вы извлекаете разные биты для каждого из числа; как есть, x=n%width;y=n%height Дает вам огромную корреляцию между x и y, как можно увидеть на ваших изображениях.

Я использую различные реализации C ++ Mersenne Twister в течение многих лет (совсем недавно способствовать ростуо) генерировать случайный точки и не имел никаких трудностей с ним (связанным с семенами или иным образом). Это действительно превосходный генератор.

Истинный случайный Генерация чисел не может быть сделана с помощью математической функции. Если важно иметь действительно случайные числа, получите Аппаратное генератор случайных чисел. Анкет Я разработал реальные деньги в онлайн -игры в покер - такой аппаратный оборудование - единственный способ быть уверенным, что в цифрах нет шаблонов.

Если нацеливаться на среду Linux, это /dev/random и/dev/urandom pseudo devices Сделайте намного лучше, чем математический генератор, поскольку они включают случайные числа, представляющие аппаратную активность.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top