24

我正在尝试在random.random()安装了不同 python3 版本的不同系统上从 python 复制随机序列。

正如文档所说,这应该很容易:

大多数随机模块的算法和播种功能可能会在 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

给出不同的结果。

为什么是这样?有什么方法可以使它起作用(即两次获得相同的随机序列?)

4

2 回答 2

20

我正在查看Python 3.2 中的新增功能(因为这个问题),我发现:

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

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

(正如 borrible 指出的那样,因为提供了兼容的播种机,所以没有违反文档合同。)

于 2012-08-13T07:21:31.790 回答
6

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

来自3.2的random模块文档的片段:

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

在版本 2(默认值)中,str、bytes 或 bytearray 对象被转换为 int 并使用其所有位。在版本 1 中,使用 x 的 hash() 代替。

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

于 2012-08-13T07:26:30.383 回答