不同系统和版本间Python伪随机数的可复现性?

20 投票
5 回答
5062 浏览
提问于 2025-04-17 09:50

我需要根据一个初始参数生成一串可控的伪随机数。为此,我使用了标准的Python随机数生成器,并用这个参数作为种子。我想确保在不同的系统(操作系统,甚至Python版本)上生成的随机数序列是一样的。

简单来说:Python能保证它的伪随机数生成器在不同的实现版本之间是可重复和可移植的吗?

5 个回答

2

@reubano - 在Python的3.2版本中,随机数生成的整数函数发生了变化,目的是让生成的随机数分布得更均匀(这也意味着输出会有所不同)。

这个变化在 Issue9025 中进行了讨论,团队讨论了他们是否有责任保持之前的输出,即使之前的输出有缺陷。他们最后得出的结论是,他们没有这个责任。关于这个模块的文档 保证了一致性,对于 random.random() 函数是如此——人们可能会 假设 调用它的其他函数(比如 random.randrange())也在这个保证之内,但实际上似乎并不是这样。

3

不一定。

根据文档的描述,random模块从2.3版本开始使用梅森旋转算法来生成随机数,而在此之前则使用的是Wichmann-Hill算法。

(如果没有提供种子,获取种子的方法还会依赖于操作系统、Python版本以及系统时间等因素。)

13

不,这并不是这样。random模块的文档中没有这样的承诺。

文档中提到的是这条备注:

在2.3版本中更改:MersenneTwister替代了Wichmann-Hill,成为默认的生成器

所以在Python 2.3之前,使用的是不同的随机数生成器。

到目前为止,我一直在使用numpy.random.RandomState来生成可重复的伪随机数,尽管它也没有提供你想要的正式承诺。

如果你想要完全的可重复性,你可能需要在你的程序中包含一份random的源代码,或者从hashlib中拼凑一个“P²RNG”(伪伪随机数生成器)。

撰写回答