Фортуна или Мерсенн Твистер предпочтительнее в качестве алгоритмического RNG?


19

В недавнем ответе упоминалось использование генераторов случайных чисел Фортуны или Мерсенна Твистера ( RNG ) для создания симуляции Монте-Карло . Я не слышал о Фортуне раньше, поэтому я посмотрел его - похоже, он в основном предназначен для криптографического использования.

В настоящее время я использую Mersenne Twister в производственном коде для заполнения алгоритма K-Means.

Какой из них (Fortuna или Mersenne Twister) считается наилучшим для «алгоритмического посева» (например, посев Монте-Карло и K-Means)? Или это «подбрасывать» - т.е. использовать наиболее удобно.

С того места, где я сижу, «лучшие» должны обеспечивать случайные числа высшего качества, работать быстро и (возможно) иметь небольшой объем памяти. Из них качество, вероятно, является наиболее важным для большинства из нас.


6
Криптографические PRNG имеют тенденцию быть намного медленнее, чем большинство других PRNG; Если вы выполняете симуляцию по методу Монте-Карло, в которой число операций PRNG исчисляется миллионами, то криптографические методы будут ужасно дорогими.
JM

1
@JM - немного подробнее, я думаю, что ваш комментарий будет хорошим ответом. Конечно, было бы интересно посмотреть, можно ли использовать современную аппаратную ускоренную криптографическую функциональность для создания высокопроизводительного потока криптографически безопасных псевдослучайных чисел.
Марк Бут

@JM хорошая точка зрения о медленных криптографических RNG - отметка против Fortuna
winwaed

Вот хороший список PRNG и множество различных статистических данных, которые могут вам пригодиться. Надеюсь, что это поможет> boost.org/doc/libs/1_48_0/doc/html/boost_random/…
pyCthon

Моя проблема с cstdlib была гранулярность - только RAND_MAX=32768возможные значения. В настоящее время я использую MT для симуляции трассировки Монте-Карло. Тем не менее, я не вижу MT в качестве узкого места производительности в моем профилировщике, вероятно, потому что я делаю «случайное» генерирование таких вещей, как направления лучей, в качестве предварительного процесса . Например, я мог бы сгенерировать массив из 100 000 лучей при запуске, сохранить их в массиве и произвольно выбрать начальную позицию массива во время выполнения (для сбора около 10 000 лучей или около того). Это имеет относительно высокую нагрузку на память в обмен на хорошее распределение случайных чисел.
Бобобобо

Ответы:


14

Ну, все это компромисс в том или ином виде. Для генераторов случайных чисел я группирую их по 3 основным категориям:

  1. Достаточно хорошо для домашней работы.
  2. Достаточно хорош, чтобы поспорить с вашей компанией.
  3. Достаточно хорош, чтобы сделать ставку на свою страну.

Линейные конгруэнтные PRNG (метод, который обычно применяется в большинстве библиотек) полностью относятся к категории 1. И Fortuna, и Mersenne Twister полностью относятся к категории 2.

Для интересной статьи о том, как испортить алгоритм перестановки может стоить вам ваша компания / казино, я рекомендую эту статью с 1999 года . Из-за гниения ссылок изображения исчезли, но на рисунке 4, на котором вы вычерчиваете следующее число из PRNG относительно предыдущего сгенерированного числа, это набор параллельных линий.

Как указывает JM, Фортуна идет медленно. Как вы указали, Мерсенн Твистер достаточно быстр.


2
Быстро просматривая печатную версию статьи , «рисунок 4» кажется кодом, а не картинкой. «Рисунок 5» выглядит как капут, но это изображение, которое я получил с WayBack Machine .
JM

Благодарю. похоже, скорость в этом случае - знак против Фортуны. Число рейнольдса Плохо тасует: да, я знаю достаточно (не много!), Что легко «отменить» случайность ГСЧ - например, выбрав плохое начальное зерно.
winwaed

Другая версия с лучшими фотографиями находится по адресу: cigital.com/papers/download/developer_gambling.php
Tangurena,

1
96-битные LCG с 32-битными выходами проходят больше статистических тестов, чем Mersenne Twisters. Никто не должен использовать Mersenne Twister в наше время, учитывая, что так легко создавать приличные не криптографические PRNG, которые намного лучше, чем MT во всех значимых отношениях.
Veedrac

4

Я думаю, что по умолчанию в категории "криптография" выбрано Blum-Blum-Shub . Как уже сказано на странице википедии, это не подходит для симуляции, потому что это слишком чертовски медленно.

Если вы работаете в Unix-подобной системе, вы также можете рассмотреть возможность получения случайных чисел непосредственно из / dev / urandom , службы операционной системы, которая обеспечивает случайные числа хорошего (хотя и не обязательно крипто) качества. В зависимости от конкретной ОС, которую вы используете, это может использовать алгоритм Ярроу - вариант которого является Fortuna. Но самый интересный аспект заключается в том, что операционная система имеет доступ к некоторым истинным случайным числам: например, к тепловому шуму от внутренних датчиков температуры. Как правило, эти данные смешиваются в случайный пул всякий раз, когда они становятся доступными для сохранения непредсказуемости данных.

Эта концепция смешивания в случайности предполагает, что можно получить лучшее из обоих миров следующим образом. Используйте более быстрый, достаточно качественный генератор случайных чисел, такой как Mersenne, в качестве основного RNG. Также поддержите второй, более качественный генератор случайных чисел - например, Fortuna. Каждое число, скажем, 25, запускает одну итерацию лучшего ГСЧ и добавляет результат в состояние вашего основного ГСЧ. Таким образом, вы получите довольно высокую производительность и довольно качественные результаты. (Я думаю, это было бы бесполезно для криптографии, потому что сила этого составного генератора вполне могла бы быть силой самого слабого звена. Но для симуляций, когда у вас, как правило, нет злонамеренного противника, это может сработать.)


/ dev / urandom безопасно использовать для криптографии в linux и free-bsd. Посмотрите на этот ответ
Адам Куркевич

Для моделирования, почему было бы желательно, чтобы случайные числа были правдой? Конечно, некоторые генераторы псевдослучайных чисел хуже, но другие подойдут для всех практических целей. Итак, почему вы считаете верность хорошей чертой?
Wrzlprmft

2

Я хотел бы сказать, что недавно я прошел через этот процесс с помощью симуляции, и я должен отметить, что использование Fortuna не исключено, если это действительно необходимо. В нашем случае мы были обеспокоены тем, что энтропия МП была недостаточно высокой, что в нашей симуляции привело бы к смещению. Так что для нашего моделирования мы использовали Fortuna, вытащив из этого алгоритма около 65 миллиардов случайных чисел. Дело в том, что компьютеры работают быстро, если вам действительно нужно, вы можете использовать их, если у вас есть причина. Если вы просто делаете что-то вроде интеграции в Монте-Карло, придерживайтесь MT.


0

Я думаю, что ответ во многом зависит от приложения, для которого вы собираетесь использовать ГСЧ. Я бы предложил четвертую категорию для грубой классификации Тангурены: «Хороший без реального выигрыша».

Для многих приложений это может просто не иметь значения, и должным образом криптографический ГСЧ может просто замедлить выполнение ваших задач без какого-либо соразмерного выигрыша в достоверности. Например, большая часть исследований, которые я провожу, требует многих, многих миллионов цифр, примерно из указанного мною распределения. Подойдет практически любая ГСЧ, поэтому мне нужен только такой, который не настолько катастрофически беден, чтобы быть бесполезным, как ГСЧ. Все остальное просто излишне замедляет работу. Я склонен использовать Mersenne Twister, но это просто потому, что он работает достаточно хорошо, у меня есть код, и он достаточно быстрый.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.