为什么在Python版本之间播种随机生成器不稳定?

时间:2012-08-13 07:16:18

标签: python python-3.x random seed

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

这应该像documentation says

一样简单
  

大多数随机模块的算法和种子功能都是   可能会在Python版本中发生变化,但有两个方面   保证不会改变:

     
      
  • 如果添加了新的播种方法,则向后兼容的播种机   将提供。
  •   
  • 生成器的random()方法将继续   当兼容的播种机给出相同的序列时,产生相同的序列   种子。
  •   

所以我希望下面的代码总是打印相同的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

给出不同的结果。

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

2 个答案:

答案 0 :(得分:19)

我正在浏览What's New in Python 3.2(因为这个问题),我找到了:

  

random.seed()函数和方法现在带有sha512哈希函数的盐串种子。要访问以前版本的种子以重现Python 3.1序列,请将version参数设置为1,random.seed(s,version = 1)。

这似乎是一个突破性的变化(从3.1到3.2),具有向后兼容性选项。

(正如可怕的指出,因为兼容的播种机 提供了文件合同没有被违反。)

答案 1 :(得分:6)

seed的文档说他们使用哈希函数将字符串转换为有效的输入种子。当我测试各种版本的Python2.X(目前没有安装3个)时,某些版本为hash(str(1))提供了不同的值。请注意,种子文档说,无论版本如何,它们都使用{{ 1}}字符串的值。您可能希望传递一个int(除了@pst关于使用向后兼容版本的种子的观点)。

来自random module docs for 3.2:

的摘录
  

如果x是int,则直接使用。

     

使用版本2(默认值),str,bytes或bytearray对象获取   转换为int并使用其所有位。随着版本1,   改为使用x的hash()。

(x这里是种子的初始化器)

相关问题