Воспроизводимость псевдослучайных чисел python в системах и версиях?

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

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

4 ответов


нет, это не так. Нет такого обещания в модуль.

что документы содержат это замечание:

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

таким образом, до Python 2.3 использовался другой RNG.

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

если вы хотите получить полную воспроизводимость, вы можете включить копию randomисточник в вашей программе или взломать вместе "P2RNG "(псевдо-псевдо-RNG) из hashlib.


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

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

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


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


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

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