Генератор псевдослучайных чисел

Каков наилучший способ создания лучшего генератора псевдослучайных чисел? (любой язык работает)

Ответ 1

Лучший способ создать один - это не делать.

Генераторы псевдослучайных чисел - очень сложный вопрос, поэтому лучше использовать реализации, созданные людьми, которые хорошо понимают субъекта.

Ответ 2

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

Алгоритм Мерсенна Твистера - популярный, довольно быстрый генератор псевдослучайных чисел, который дает довольно хорошие результаты. У него очень большой период, но также относительно большое состояние (2,5 кБ). Однако это не считается достаточно хорошим для криптографических приложений.

Обновление: поскольку этот ответ был написан, было опубликовано семейство алгоритмов PCG, которое, по-видимому, превосходит существующие не криптографические алгоритмы по большинству направлений (скорость, память, случайность и период), что делает его отличным универсальным выбором для всего, кроме криптографии.

Если вы делаете крипто, хотя, мой ответ остается: не катите свой собственный.

Ответ 3

Немецкий журнал C't проверил ряд программных и аппаратных генераторов в выпуске 2/2009 и провел результаты с помощью различных статистических тестов.

Я просмотрел результаты здесь.

Я бы не стал писать свои собственные. В статье упоминается, что даже Дональд Кнут потерпел неудачу с его "генератором сверхвысоких чисел", который не был таким случайным в конце концов. Получите тот, который прошел все тесты (имел результат > 0 во всех столбцах). Они также протестировали установку с VIA EPIA M10000 mobo, у которой есть аппаратный RNG. Мне нравится этот вариант для коммерческой или полу-коммерческой установки, для которой требуется надежный сервер с числовыми номерами с высокой пропускной способностью.

Если, конечно, вы просто играете, и в этом случае этот может быть достаточно хорошим.

Ответ 4

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

xkcd random number

Ответ 5

Yikes, это может усложнить VEEEEEERY! Кажется, есть ряд метрик для того, как измерить "случайность" генератора случайных чисел, поэтому трудно определить, какие из них являются "лучшими". Я бы начал с Числовых Рецептов в C (или любого языка, на котором вы можете найти один) для нескольких примеров. Я написал свой первый простой пример из приведенных там примеров.

РЕДАКТИРОВАТЬ: Важно также начать с определения, насколько сложным вам нужен генератор случайных чисел. Я помню грубое пробуждение, которое я испытал в C несколько лет назад, когда обнаружил, что генератор случайных чисел по умолчанию имеет период где-то около 32 767, что означает, что он имел тенденцию повторяться периодически после генерации такого количества чисел! Если вам нужно несколько бросков кубиков, это нормально. Но не тогда, когда вам нужно генерировать миллионы "случайных" значений для симуляции.

Ответ 7

См. эту ссылку для набора тестов TestU01, который включает в себя несколько батарей тестов.

http://www.iro.umontreal.ca/~simardr/testu01/tu01.html

В статье автор демонстрирует результат теста на множестве существующих RNG, но не .NET System.Random(насколько я могу судить). Хотя он и тестирует генератор VB6.

Очень немногие проходят все тесты...

Ответ 8

Украсть одно из сундука. Это высокое качество и прост в реализации. Он использует пару массивов, дополнение и пару ifs. Дешевый, эффективный и приятный длительный период 2 ^ 55, если я правильно помню.

Ответ 9

Если вы собираетесь работать на С++, Boost содержит коллекцию PRNG, которой я бы доверял намного больше, чем независимо от того, что входит в стандартные библиотеки. Документация может оказаться полезной при выборе одного из них. Как всегда, насколько хорош PRNG, зависит от того, для чего вы его используете.