Подтвердить что ты не робот

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

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

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

4b9b3361

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