跨系统和版本的python伪随机数的再现性?

时间:2012-01-09 09:16:08

标签: python random portability

在给定初始参数的情况下,我需要生成受控的伪随机数序列。为此,我使用标准的python随机生成器,由此参数播种。我想确保我将跨系统生成相同的序列(操作系统,还有Python版本)。

总结:python是否确保其实现版本的伪随机数生成器的可重复性/可移植性?

5 个答案:

答案 0 :(得分:7)

不,它没有。 random module's documentation中没有这样的承诺。

文档包含的内容就是这句话:

  

版本2.3更改:MersenneTwister取代Wichmann-Hill作为默认生成器

因此在Python 2.3之前使用了不同的RNG。

到目前为止,我一直在使用numpy.random.RandomState来实现可重现的伪随机性,尽管它也没有达到你所追求的正式承诺。

如果您想要完全重现性,您可能希望在程序中包含random源的副本,或者从hashlib一起破解“P²RNG”(伪伪RNG)。

答案 1 :(得分:3)

不一定。

正如documentation中所述,random模块使用Mersenne twister生成自2.3版以来的随机数,但在此之前使用了Wichmann-Hill。

(如果未提供种子,获取种子的方法也取决于操作系统,Python版本以及系统时间等因素。

答案 2 :(得分:1)

正如一个提示:除了2.3更改之外,python 3还提供来自randrange和其他函数的python 2.x中的数字,即使random.random中的数字相似也是如此。

答案 3 :(得分:1)

@reubano - 3.2随机更改整数函数,以产生更均匀分布(这不可避免地意味着不同)的输出。

Issue9025讨论了这一变化,团队讨论了他们是否有义务坚持以前的输出,即使它有缺陷。他们的结论是他们没有。 random.random()模块guarantee consistency的文档 - 可能假设调用它的函数(如random.randrange())隐含在该保证下,但是似乎并非如此。

答案 4 :(得分:0)

我刚刚发现python3.7和python3.8之间也有区别。

以下代码的行为相同

from random import Random
seed = 317
rand = Random(seed)
rand.getrandbits(64)

但是如果您改用from _random import Random,则其行为会有所不同。