Воспроизводимость псевдослучайных чисел python в системах и версиях?
Мне нужно создать управляемую последовательность псевдослучайных чисел, учитывая исходный параметр. Для этого я использую стандартный генератор случайных питонов, засеянный этим параметром. Я хотел бы убедиться, что я буду генерировать одну и ту же последовательность в разных системах (операционная система, но также версия Python).
Вкратце: обеспечивает ли python воспроизводимость/переносимость его генератора псевдослучайных чисел для реализации и версий?
Ответы
Ответ 1
Нет, это не так. В документации random
нет такого обещания.
В каких документах содержится это замечание:
Изменено в версии 2.3: MersenneTwister заменил Wichmann-Hill в качестве генератора по умолчанию
Таким образом, перед Python 2.3 использовался другой RNG.
До сих пор я использовал numpy.random.RandomState
для воспроизводимой псевдослучайности, хотя это тоже не делает официальное обещание, которое вы после.
Если вы хотите полную воспроизводимость, вы можете захотеть включить копию источника random
в свою программу или взломать "P²RNG" (псевдо-псевдо-RNG) из hashlib
.
Ответ 2
Не обязательно.
Как описано в документации, модуль random
использовал Mersenne twister для генерации случайных чисел с версии 2.3, но до этого использовал Wichmann-Hill.
(Если семя не предусмотрено, метод получения семени также зависит от операционной системы, версии Python и от таких факторов, как системное время).
Ответ 3
Точно так же, как хедз-ап: помимо изменения 2.3, python 3 дает числа из python 2.x из randrange и, возможно, другие функции, даже если числа из random.random похожи.
Ответ 4
@reubano - 3.2 изменил целочисленные функции в случайном порядке, чтобы получить более равномерно распределенные (что неизбежно означает разные) выходные данные.
Это изменение обсуждалось в Issue9025, где команда обсуждает, есть ли у них обязательство придерживаться предыдущего вывода, даже если он был дефектным. Они заключают, что они этого не делают. Документы для модуля гарантируют согласованность для random.random()
- можно предположить, что функции, которые его называют (например, random.randrange()
), неявно охватываются под этой гарантией, но это, похоже, не так.