是否保证带有随机生成器的 pyhon2/python3 脚本初始化为random.setstate()
或random.seed()
将在不同版本和平台上产生相同的伪随机序列?(例如python 3.1 on Mac , the same as python 3.2 on Linux 64-bit
)
问题是关于:python2 和 python3,假设 python3 脚本将在 python3 解释器上运行,反之亦然。
是否保证带有随机生成器的 pyhon2/python3 脚本初始化为random.setstate()
或random.seed()
将在不同版本和平台上产生相同的伪随机序列?(例如python 3.1 on Mac , the same as python 3.2 on Linux 64-bit
)
问题是关于:python2 和 python3,假设 python3 脚本将在 python3 解释器上运行,反之亦然。
Python 2.3 及更高版本使用 Mersenne Twister 生成器,它独立于系统随机函数(作为 Python 的 C 扩展模块实现)。对于使用 Mersenne Twister 的任何版本,不同版本和平台的结果应该相同。
以前,您可以使用生成器保证向后兼容性WichmannHill
,但不幸的是,它似乎已在 Python 3.x 中删除。
如果您绝对需要保证兼容性,请按照文档的建议编写自己的Random
子类(或使用稳定的外部实现,例如simplerandom)random
:
如果您想使用您自己设计的不同基本生成器,也可以将类 Random 子类化:在这种情况下,覆盖 random()、seed()、getstate()、setstate() 和 jumpahead() 方法。可选地,一个新的生成器可以提供一个 getrandbits() 方法——这允许 randrange() 在任意大的范围内产生选择。
您可以使用simplerandom模块,它具有独立于 Python 平台的一致实现。它支持 Python 2.4、2.5、2.6、2.7、3.1 和 3.2。它有 9 种不同的算法。
这是一个例子:
>>> import simplerandom.iterators as sri
>>> rng = sri.MWC1(12345)
>>> next(rng)
498186671L
>>> next(rng)
888940288L
>>> next(rng)
345072384L
只要你用相同的值做种子,你就会得到相同的结果:
>>> rng = sri.MWC1(12345)
>>> next(rng)
498186671L
>>> rng = sri.MWC1(98765)
>>> next(rng)
3546724783L