Воспроизводимость псевдослучайных чисел 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()
) неявно охватываются этой гарантией, но это, похоже, не так.