лучший генератор псевдослучайных чисел - PullRequest
24 голосов
/ 18 января 2011

На сегодняшний день, какой генератор псевдослучайных чисел является лучшим?Под лучшим я подразумеваю тот, который -

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

Я могу думать о МТ.Есть ли PRNG лучше, чем MT?Какой вариант MT лучше?

Ответы [ 6 ]

30 голосов
/ 05 июля 2016

Просто быстрое обновление, так как ответы показывают их возраст: сегодня Twister Mersenne Twister уже не считается современным (несколько раздутым, предсказуемым, учитывая всего 624 значения, медленный к посеву, возможен плохой посев, ...) .

Нормальный PRNG

Для нормальных применений, где важны хорошие статистические свойства и скорость, рассмотрим

  • Семейство О'Нила PCG ,
  • Семейство * Vigna Xoroshiro , скажем, Xoroshiro128 + (кстати, не японское имя, а "X-or, вращать, сдвигать, вращать") и
  • D. Набор Random123 Э. Шоу (который включает в себя Филокса и хорошо названную ARS, упрощение шифрования бесконечной последовательности нулей с помощью AES-CTR), хотя я не уверен, насколько тщательно изучен PRNG Random123 .

Криптографически безопасный PRNG (CSPRNG)

Для криптографических приложений, где важна непредсказуемость, рассмотрим криптографически безопасный PRNG, такой как

Примечание. В предыдущей версии я указывал, что алгоритмы Random123 криптографически безопасны, но они не .

Тестирование PRNG

Аналогично, для статистических испытаний PRNG, в настоящее время уровень техники, вероятно, составляет

  • L'Ecuyer ' TestU01 (с SmallCrush, Crush, BigCrush),
  • Прати и Доти-Хамфри с набором PractRand

пока они исторически важны, но устарели:

  • Die Marshlia DieHard, DieHarder,
  • NIST 800-22 A.
20 голосов
/ 21 января 2011

Попробуйте преемник MT: SFMT (http://www.math.sci.hiroshima -u.ac.jp / ~ m-mat / MT / SFMT / index.html ).Акроним расшифровывается как SIMD-ориентированный Fast Mersenne Twister .Он использует векторные инструкции, такие как SSE или AltiVec, чтобы ускорить генерацию случайных чисел.

Более того, он отображает более длительные периоды, чем исходный MT: SFMT можно настроить на использование периодов до 2 216091 -1.

Наконец, у МТ были некоторые проблемы при плохой инициализации: он, как правило, рисовал много 0, что приводило к случайным числам плохого качества.Эта проблема может длиться до 700000 обращений, прежде чем будет компенсирована повторением алгоритма.Как следствие, SFMT также был разработан, чтобы выходить из этого состояния с нулевым избытком гораздо быстрее, чем его старший.

Проверьте ссылку, которую я дал в начале этого поста, чтобы найти исходный код и научные публикации.описывая этот алгоритм.

Чтобы убедить вас, вы можете увидеть здесь http://www.math.sci.hiroshima -u.ac.jp / ~ m-mat / MT / SFMT / speed.html таблицу, сравнивающую скорости генерациикак MT, так и SFMT.В любом случае, SFMT быстрее выдает лучшие качества, чем MT.

- редактировать следующие комментарии -

В целом, когда вы выбираете PRNG, вам необходимо учитывать разрабатываемое приложение.Действительно, некоторые PRNG лучше соответствуют ограничениям некоторых приложений.Например, генераторы MT и WELL не очень хорошо подходят для криптографических приложений, хотя они являются лучшим выбором при работе с симуляциями Монте-Карло.

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

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

5 голосов
/ 22 сентября 2011

Если вы ищете алгоритм, который проходит все статистические тесты, но все еще быстр, вы можете попробовать Xorshift-Algorithm .По сравнению со случайной библиотекой в ​​Java она примерно на 30% быстрее и обеспечивает лучшие результаты.Его Период не такой длинный, как у Mersenne Twister, но он все еще приличный.

Реализацию можно найти здесь:

http://demesos.blogspot.com/2011/09/replacing-java-random-generator.html

Редактировать

Похоже, что новые варианты XORShift теперь даже превосходят MerseneTwister и WELL по качеству (но не по периодам).Они проходят более эмпирические тесты качества, что можно увидеть в PRNG Shootout .

Они также впечатляют в производительности.Я сделал бенчмарк различных реализаций в Java, источник и результаты здесь: https://github.com/tobijdc/PRNG-Performance

4 голосов
/ 27 ноября 2014
  1. проходит все статистические тесты

Каждый PRNG, упомянутый в других ответах, до сих пор широко принадлежит к семейству GNSR / LFSR PRNG. Все они не соответствуют бинарному рангу матрицы и, возможно, тестам линейной сложности.

Есть много много PRNG, которые проходят все статистические тесты общего назначения, но по некоторым причинам люди, кажется, считают GFSR более сексуальными.

Вот пример PRNG, который проходит все статистические тесты общего назначения, но не является криптографически безопасным:

static unsigned long long rng_a, rng_b, rng_c, rng_counter;
unsigned long long rng64() {
    unsigned long long tmp = rng_a + rng_b + rng_counter++;
    rng_a = rng_b ^ (rng_b >> 12);
    rng_b = rng_c + (rng_c << 3);
    rng_c = ((rng_c << 25) | (rng_c >> (64-25))) + tmp;
    return tmp;
}
void seed(unsigned long long s) {
    rng_a = rng_b = rng_c = s; rng_counter = 1;
    for (int i = 0; i < 12; i++) rng64();
}

(Предполагается, что long long - это 64-битный целочисленный тип ... Я думаю, это верно везде, где этот тип определен?)

Этого вполне достаточно для любого обычного использования, а также достаточно быстро. Если вам нужно что-то лучше, переключитесь на CSPRNG - они, как правило, намного лучше, чем любой не крипто-PRNG. Например, ChaCha (http://cr.yp.to/chacha.html) - это сплошная CSPRNG с быстрым посевом, произвольным доступом и регулируемым качеством. HC-256 (http://en.wikipedia.org/wiki/HC-256) - это еще более качественный CSPRNG, он медленный, но достаточно быстрый после посева.

  1. ведет себя хорошо даже при очень больших размерах

Это в значительной степени эквивалентно пункту № 1. Кроме того, пример PRNG, который я предложил, относится к хаотическому типу - такие PRNG, если они плохо себя ведут, делают это при небольшом количестве измерений, а не при большом количестве.

  1. имеет чрезвычайно большой период

Определить чрезвычайно большой?

Пример PRNG, который я предложил выше, имеет доказуемый минимальный период 2 ^ 64, средний период 2 ^ 255 и пространство состояний 2 ^ 256. Для двух CSPRNG, которые я связал, ChaCha имеет период 2 ^ 68 и пространство состояний 2 ^ 260, а HC-256 имеет средний период где-то порядка 2 ^ 65000 или около того IIRC и предлагает вероятностное доказательство того, что его кратчайший цикл больше 2 ^ 128 с вероятностью больше 1- (2 ^ -128) и имеет пространство состояний около 2 ^ 65000.

На практике период не имеет значения более 2 ^ 60, и даже это маргинально. Обычно причина, по которой люди спрашивают о высоком периоде, заключается в том, что либо они не знают, о чем говорят, либо потому, что им нужно большое пространство состояний (которое, по крайней мере, равно периоду, но часто больше), что может быть полезно около 2 ^ 250. Но большое пространство состояний не очень поможет, если вы не заполняете что-то большее, чем одно целое число, а большинство людей этого не делают.

(примечание: в коде ^ используется для обозначения xor, но в тексте ^ используется для обозначения показателя степени)

4 голосов
/ 29 января 2011

Что ж, генератор WELL является обобщением и улучшением MT-19937.

2 голосов
/ 18 января 2011

MT, кажется, соответствует вашим критериям:

Он имеет колоссальный период 2 19937 -1 итераций (> 43 × 10 6000 ), доказано, что он равномерно распределен (до) 623 измерений (для 32 битовые значения) и работает быстрее, чем другие статистически обоснованные генераторы

( От: Википедия )

Mersenne Twister является одним из наиболее тщательно протестированных генераторов случайных чисел из существующих. Однако, будучи полностью детерминированным, он не подходит для всех целей и совершенно не подходит для криптографических целей.

( От: документы Python )

И Википедия есть что сказать о криптографически защищенных prng'ах, если это вас интересует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...