python random.setstate(),seed() - 是否保证跨实现具有相同的结果?

时间:2012-09-16 19:44:17

标签: python random python-3.x python-2.x

是否可以保证使用random.setstate()random.seed()初始化的随机生成器的pyhon2 / python3脚本将在不同的版本和平台上产生相同的伪随机序列? (例如python 3.1 on Mac , the same as python 3.2 on Linux 64-bit

问题是关于:python2和python3,假设python3脚本将在python3解释器上运行,反之亦然。

2 个答案:

答案 0 :(得分:6)

Python 2.3及更高版本使用Mersenne Twister生成器,它独立于系统随机函数(作为Python的C扩展模块实现)。对于使用Mersenne Twister的任何版本,不同版本和平台的结果应该相同。

以前,您可以使用WichmannHill生成器保证向后兼容性,但遗憾的是,它似乎已在Python 3.x中删除。

如果您绝对需要保证兼容性,请按照Random文档的建议编写您自己的random子类(或使用稳定的外部实现,例如simplerandom):

  如果你想使用你自己设计的不同的基本生成器,

类Random也可以是子类:在这种情况下,覆盖random(),seed(),getstate(),setstate()和jumpahead()方法。可选地,新生成器可以提供getrandbits()方法 - 这允许randrange()在任意大范围内产生选择。

答案 1 :(得分:4)

您可以使用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