2009-11-24 2 views
2

Я использую реализацию C# Mersenne Twister, которую я загрузил с CenterSpace. У меня есть две проблемы, связанные с ним:Mersenne Twister: посев и визуализация

  1. Независимо от того, как я засеять алгоритм это не проходит DieHard tests, и я имею в виду я получаю довольно много 1s и 0s для р-значения. Также мой KStest на 269 p-значениях равен 0. Ну, я не могу интерпретировать p-значение, но я думаю, что несколько 1s и 0s в результате - плохие новости.
  2. Меня попросили визуально показать случайность чисел. Поэтому я рисую числа по мере их создания, и это вообще не кажется случайным. Вот два скриншота результата after a few seconds и a few seconds later. Как вы можете видеть на втором скриншоте, числа попадают на некоторые параллельные линии. Я пробовал разные алгоритмы для сопоставления чисел с точками. Все они приводят к параллельным линиям, но с разными углами! Вот как я сопоставил числа с точками для этих скриншотов: new Point(number % _canvasWidth, number % _canvasHeight). Как вы можете догадаться, визуальный результат зависит от ширины и высоты формы, а this is - катастрофический результат.

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

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

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

ответ

3

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

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

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

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

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

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

+0

Спасибо за ответ fbrereto. Ваше мнение о равной ширине и высоте очень верно. Я не знаю, как я это пропустил :) Вот как я начал отображение: var x = (int) (number & 0xffff0000); var y = число & 0x0000ffff; x = x% _canvasWidth; y = y% _canvasHeight; Это как-то похоже на ваше решение; однако, я думаю, функция мод все еще искажает результат. FYI это отображение вызвало вертикальные парализованные линии! –

+0

вам нужно сдвинуть свои значения x вниз; после битовой маски они будут находиться в верхних двух байтах вашего числового вывода, и все они будут большими числами, которые могут исказить ваш мод. – fbrereto

+0

Мод, вероятно, всегда будет показывать некоторый уклон, когда вы нарисуете результаты на экране. С тем, что вы пытаетесь сделать, я бы рекомендовал не рисовать большие координаты (вне окна) или линейную интерполяцию. – fbrereto

-1

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

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

+0

Спасибо за ответ. Существует так много онлайн-игровых сайтов, которые используют Mersenne Twister для RNG: http://practice.galewindsoftware.ca/demo/casino/help/certified/RNG_Certification_Galewind_Software.pdf и http://www.pkr.com/ ru/support/licensing-and-integrity/ежемесячные сертификаты/ –

+0

-1: Это FUD. Алгоритм Twers Mersenne генерирует чрезвычайно хорошие случайные числа. Это алгоритм случайных чисел по умолчанию для Python. Хотя технически псевдослучайный, он имеет смешной период повторения - больше, чем количество частиц в наблюдаемой вселенной. Ваш аргумент необоснован. –

+1

Вы бы поставили деньги на, скажем, сайт блэкджека, который использовал некоторую реализацию Mersenne Twister? Можно ли показать правильность и честность реализации гораздо больше, чем просто подключение генератора случайных чисел. – wallyk

0

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

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

+0

Использование двух чисел для построения звуков, как решение для моей второй проблемы, но почему-то это заставляет меня чувствовать себя виноватым!Я имею в виду пользователя и, возможно, аудитора, каждая точка представляет собой один номер! С вашим опытом работы с MT, как вы обычно его семена? Любые комментарии к dieHard? –

Смежные вопросы