Mersenne Twister: посева и визуализация
-
21-09-2019 - |
Вопрос
Я использую реализацию C# Mersenne Twister, которую я скачал ЦЕНТРЕРСКИЙ. Анкет У меня есть две проблемы с этим:
- Независимо от того, как я заселяю алгоритм, он не проходит Несгибаемые испытания, и под этим я имею в виду, я получаю довольно много 1 и 0 с. Кроме того, мой Kstest на 269 P-значениях-0. Ну, я не могу интерпретировать значение p, но я думаю, что несколько 1 и 0 в результате-плохие новости.
- Меня попросили визуально показать случайность чисел. Таким образом, я планирую цифры по мере их создания, и это вообще не кажется случайным. Вот два скриншота результата Через несколько секунд а также Через несколько секунд. Анкет Как вы можете видеть во втором скриншоте, числа падают на некоторые параллельные линии. Я пробовал разные алгоритмы, чтобы отобразить номера с точками. Все они приводят к параллельным линиям, но с разными углами! Вот как я наметил числа с точками для этих скриншотов:
new Point(number % _canvasWidth, number % _canvasHeight)
. Анкет Как вы можете догадаться, визуальный результат зависит от ширины и высоты формы, и Это катастрофический результат.
Вот несколько способов, которыми я попытался заселить алгоритм:
- Пользовательская запись. Я ввожу несколько чисел, чтобы заселить алгоритм как массив Int.
- Случайные числа, сгенерированные самим алгоритмом !!
- Массив
new Guid().GetHashCode()
Что мне здесь не хватает? Как мне заселить алгоритм? Как я могу заставить его пройти на несгибаемость?
Решение
Хотя я не могу поговорить с вашей первой точкой, вторая проблема связана с тем, как вы вычисляете точки, которые нужно нарисовать. Конкретно,
x = number % _canvasWidth;
y = number % _canvasHeight;
Даст вам «шаблон», который несколько соответствует соотношению сторон окна, на которое вы рисуете. Например, если _canvasWidth
а также _canvasHeight
были равны, вы всегда бы нарисовали на одну диагональную линию как x
а также y
всегда будет одинаковым. Это графическое представление не будет подходящим в этом случае.
Как насчет того, чтобы взять n битов вывода RNG и использования половины для координаты X, а другая половина для координаты Y? Для тех битов, которые выпадают из границ вашего окна, вы можете рассмотреть два варианта:
- Не нарисуйте их (или не нарисуйте за кадром)
- Выполните линейную интерполяцию, чтобы отобразить диапазон битов по ширине/высоте вашего окна
Любой вариант должен дать вам более репрезентативную картину битов, которые вы получаете из нашего генератора случайных чисел. Удачи!
Другие советы
Ваша проблема с подсветкой точки должна легко исправить, генерируя новое случайное число для каждого из координат X и Y. Попытка повторного использования одного сгенерированного числа для X и Y - это в основном преждевременная оптимизация, но если вы пойдете по этому пути, убедитесь, что вы извлекаете разные биты для каждого из числа; как есть, x=n%width;y=n%height
Дает вам огромную корреляцию между x и y, как можно увидеть на ваших изображениях.
Я использую различные реализации C ++ Mersenne Twister в течение многих лет (совсем недавно способствовать ростуо) генерировать случайный точки и не имел никаких трудностей с ним (связанным с семенами или иным образом). Это действительно превосходный генератор.
Истинный случайный Генерация чисел не может быть сделана с помощью математической функции. Если важно иметь действительно случайные числа, получите Аппаратное генератор случайных чисел. Анкет Я разработал реальные деньги в онлайн -игры в покер - такой аппаратный оборудование - единственный способ быть уверенным, что в цифрах нет шаблонов.
Если нацеливаться на среду Linux, это /dev/random и/dev/urandom pseudo devices Сделайте намного лучше, чем математический генератор, поскольку они включают случайные числа, представляющие аппаратную активность.