是否可以保证使用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解释器上运行,反之亦然。
答案 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