为什么播种随机生成的Python版本之间并不稳定?(Why is seeding the rando

2019-06-27 00:33发布

我试图重现从Python的随机序列random.random()在不同的系统上安装了不同版本的python3。

因为这应该是简单的文件说 :

大多数的随机模块的算法和播种功能的是不同的Python版本中的更改,但两个方面都保证不会改变:

  • 如果添加了一个新的播种法,那么向后兼容播种机将提供。
  • 发生器的随机()方法将继续产生相同的序列时,兼容播种机被给予相同的种子。

所以,我希望下面的代码总是打印相同的10个号码,不管具体python3版本:

import sys
print(sys.version)

from random import seed, random

seed(str(1))
for i in range(10):
    print(random())

然而,测试它在两台不同的机器:

3.2.3 (default, May  3 2012, 15:51:42) 
[GCC 4.6.3]
0.4782479962566343
0.044242767098090496
0.11703586901195051
0.8566892547933538
0.2926790185279551
0.0067328440779825804
0.0013279506360178717
0.22167546902173108
0.9864945747444945
0.5157002525757287

3.1.2 (release31-maint, Dec  9 2011, 20:59:40)  
[GCC 4.4.5]
0.0698436845523
0.27772471476
0.833036057868
0.35569897036
0.36366158783
0.722487971761
0.963133581734
0.263723867191
0.451002768569
0.0998765577881

得出不同的结果。

为什么是这样? 而有没有什么办法,使这项工作(即获得相同的随机序列两次?)

Answer 1:

我一直在寻找通过在Python 3.2新增功能 (因为这个问题),我发现:

所述random.seed() 现在函数和方法盐串种子与SHA512散列函数。 要访问种子的先前版本,以再现的Python 3.1序列,设置版本参数为1,random.seed(S,版本= 1)。

这似乎是一个重大更改(从3.1到3.2)具有向后兼容性选项。

(由于borrible指出,由于兼容播种机提供文档的合同还没有受到侵犯。)



Answer 2:

对于文档seed说,他们使用的哈希函数将字符串转换为有效的输入种子。 当我测试Python2.X(没有安装此刻3)的各种版本,有些版本给不同值hash(str(1))请注意,对于种子的文档说,不管版本,它们使用hash的字符串值。 你可能想传递一个int,而不是(除了有关使用种子的向后兼容的版本@pst的点)。

从该片段random模块文档为3.2:

如果x是一个int,它被直接使用。

与版本2(缺省值),一个STR,字节,字节组或对象被转换为int及其所有位都被使用。 与版本1,散列(x的)来代替。

(X这里是种子初始化)



文章来源: Why is seeding the random generator not stable between versions of Python?