在给定初始参数的情况下,我需要生成受控的伪随机数序列。为此,我使用标准的python随机生成器,由此参数播种。我想确保我将跨系统生成相同的序列(操作系统,还有Python版本)。
总结:python是否确保其实现和版本的伪随机数生成器的可重复性/可移植性?
答案 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
,则其行为会有所不同。