Чи є Фортуна або Мерсенн Твістер кращим як алгоритмічний RNG?


19

Нещодавна відповідь згадував про використання генераторів Fortuna або Mersenne Twister випадкових чисел ( RNG ) для посіву моделювання в Монте-Карло . Раніше я не чув про Фортуну, тому переглянув її - схоже, вона в основному призначена для криптографічного використання.

В даний час я використовую 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. І Фортуна, і Мерсен Твістер суцільно ставляться до категорії 2.

Що стосується цікавої статті про те, як алгоритм перетасовки може коштувати вашій компанії / казино, я рекомендую це з 1999 року . Через гниль зв’язку зображень більше немає, але на малюнку 4, на якому ви будуєте наступне число з PRNG проти попереднього згенерованого числа, є набір паралельних ліній.

Як вказує Дж. М., Фортуна повільна. Як ви вже зазначали, Mersenne Twister досить швидко.


2
Швидко проглядаючи версію для друку статті , "цифра 4" здається кодом замість малюнка. "Рисунок 5" виглядає капутом, але це зображення, яке я отримав з машини WayBack .
JM

Спасибі. схоже, швидкість - це позначка проти Фортуни в цьому випадку. Re. Погані перетасування: так, я знаю достатньо (не так багато!), Що легко "скасувати" випадковість RNG - наприклад, вибравши поганий початковий насіння.
winwaed

Ще одна версія з кращими картинками - за адресою: cigital.com/papers/download/developer_gambling.php
Тангурена

1
96-бітні ЖКГ з 32-бітовими виходами проходять більше статистичних тестів, ніж Мерсенн Твістерс. В даний час ніхто не повинен використовувати Mersenne Twister, враховуючи, що так легко зробити гідні некриптографічні PRNG, які набагато кращі, ніж MT у будь-якому значущому плані.
Ведрак

4

Вибір за замовчуванням у категорії "криптографічні" - це , думаю, Блюм-Блюм-Шуб . Як уже говориться на сторінці вікіпедії, це не підходить для моделювання, оскільки це занадто повільно.

Якщо ви працюєте в системі, схожій на unix, ви також можете розглянути можливість отримання випадкових чисел безпосередньо з / dev / urandom , сервісу операційної системи, який забезпечує хороші (хоча і не обов'язково крипто) якісні випадкові числа. Залежно від конкретної ОС, якою ви користуєтесь, для цього може використовуватися алгоритм Yarrow - варіант якого Fortuna є. Але найцікавіший аспект полягає в тому, що операційна система має доступ до деяких справжніх випадкових чисел: наприклад, теплового шуму від внутрішніх датчиків температури. Зазвичай ці дані змішуються у випадковий пул щоразу, коли вони стають доступними для збереження даних непередбачуваними.

Ця концепція змішування у випадковості говорить про те, що можна отримати найкраще з обох світів наступним чином. Використовуйте швидший, досить якісний генератор випадкових чисел, наприклад, Мерсенн, як ваш базовий RNG. Підтримуйте і другий, більш якісний генератор випадкових чисел - наприклад, Фортуна. Кожні стільки чисел, скажімо, 25, запускайте одну ітерацію кращої RNG і додайте результат у стан вашої базової RNG. Таким чином ви отримаєте досить високу продуктивність і досить якісні результати. (Я б припустив, що це буде марно для криптовалюти, тому що сила цього складеного генератора цілком може бути силою самого слабкого посилання. Але для моделювання, де у вас зазвичай немає зловмисного противника, це може спрацювати.)


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

Для моделювання, чому було б бажаним, щоб випадкові числа були правдивими? Звичайно, деякі генератори псевдовипадкових чисел гірші, але інші будуть рівними для всіх практичних цілей. Отже, чому ви вважаєте справжність як хорошу особливість?
Wrzlprmft

2

Мені хотілося зазвучити, щоб сказати, що я нещодавно пройшов цей процес з імітацією, і я повинен зазначити, що використання Fortuna не викликає сумнівів, якщо це дійсно необхідно. У нашому випадку ми були стурбовані тим, що ентропія МТ була недостатньо високою, що могло б перевести в нашому моделюванні зміщення. Тож для нашого моделювання ми використали Фортуну, витягуючи з цього альго близько 65 мільярдів випадкових чисел. Справа в тому, що комп'ютери швидкі, якщо вам це справді потрібно, ви можете користуватися ним, якщо у вас є причина. Якщо ви просто робите щось на зразок інтеграції Монте-Карло, дотримуйтесь MT.


0

Я думаю, що відповідь дуже залежить від програми, яку ви збираєтесь використовувати для RNG. Я б запропонував четверту категорію для грубої класифікації Тангурена: "Добре без реального виграшу".

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.