Воспроизводимость псевдослучайных чисел в разных системах и версиях? - PullRequest
14 голосов
/ 09 января 2012

Мне нужно сгенерировать контролируемую последовательность псевдослучайных чисел, учитывая начальный параметр.Для этого я использую стандартный генератор случайных чисел python, который определяется этим параметром.Я хотел бы убедиться, что я сгенерирую одну и ту же последовательность в разных системах (операционная система, но также и версия Python).

В заключение: обеспечивает ли python воспроизводимость / переносимость своего генератора псевдослучайных чисел на всех реализация и версии ?

Ответы [ 4 ]

7 голосов
/ 09 января 2012

Нет, это не так.В документации модуля random нет такого обещания .

В документации содержатся следующие замечания:

Изменено в версии 2.3: MersenneTwister заменил Wichmann-Хилл в качестве генератора по умолчанию

Так что до Python 2.3 использовался другой ГСЧ.

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

Если вам нужна полная воспроизводимость, вы можете включить в программу копию источника random иливзломать "P²RNG" (псевдопсевдо-RNG) из hashlib.

3 голосов
/ 09 января 2012

Не обязательно.

Как описано в документации , модуль random использовал Mersenne twister для генерации случайных чисел начиная с версии 2.3, но до этого использовал Wichmann-Hill.

(Если начальное число не предоставлено, метод получения начального числа также зависит от операционной системы, версии Python и таких факторов, как системное время).

1 голос
/ 16 июня 2017

@ reubano - 3.2 изменил целочисленные функции случайным образом, чтобы получить более равномерно распределенный (что неизбежно означает различный) вывод.

Это изменение обсуждалось в Issue9025 , где команда обсуждает, обязаны ли они придерживаться предыдущего результата, даже если он был дефектным. Они заключают, что они не делают. Документы для модуля гарантируют согласованность для random.random() - можно предположить , что функции, которые его вызывают (например, random.randrange()), неявно подпадают под эту гарантию, но это не похоже, дело в этом.

1 голос
/ 20 октября 2013

Точно так же: в дополнение к изменению 2.3, python 3 дает числа из python 2.x из randrange и, возможно, другие функции, даже если числа из random.random похожи.

...