【问题标题】:Why is seeding the random generator not stable between versions of Python?为什么在 Python 版本之间播种随机生成器不稳定?
【发布时间】:2026-01-17 07:00:02
【问题描述】:

我正在尝试在安装了不同 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.7 中运行您的代码 sn-p 会产生一组与您发布的两个完全不同的数字。
  • 它声明将提供向后兼容的播种机,而不是现有方法将向后兼容。

标签: python python-3.x random seed


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,这一定是问题所在。我必须说,版本参数在 3.1 中还没有出现不是很方便:(
  • 当您使用字符串种子时适用。与 OP 不同,我用整数播种我的随机数生成器,并看到不同的结果。顺便说一句,getstate() 方法返回相同的内部状态,所以改变的不是种子位,而是实际的随机数生成。
  • 哦,实际上我看到 random.random() 产生相同的序列——它是 random.shuffle() 和 random.randrange() 在 Python 3.1 和 3.2 上产生不同的结果,即使给定相同的种子。 :-(
【解决方案2】:

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

来自random module docs 3.2 的片段:

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

对于版本 2(默认),str、bytes 或 bytearray 对象获取 转换为 int 并使用其所有位。在版本 1 中, 而是使用 x 的 hash()。

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

【讨论】: