python random.setstate(),seed()-是否保证在不同的实现中得到相同的结果?
是否可以保证使用python random.setstate(),seed()-是否保证在不同的实现中得到相同的结果?,python,random,python-3.x,python-2.x,Python,Random,Python 3.x,Python 2.x,是否可以保证使用random.setstate()或random.seed()初始化的随机生成器的pyhon2/python3脚本将在不同版本和平台上产生相同的伪随机序列?(例如,Mac上的python 3.1与Linux 64位上的python 3.2相同) 问题是关于这两个方面的:python2和python3,假设python3脚本将在python3解释器上运行,反之亦然。python2.3及以上版本使用Mersenne Twister生成器,它独立于系统随机函数(作为Python的C扩展
random.setstate()
或random.seed()
初始化的随机生成器的pyhon2/python3脚本将在不同版本和平台上产生相同的伪随机序列?(例如,Mac上的python 3.1与Linux 64位上的python 3.2相同)
问题是关于这两个方面的:python2和python3,假设python3脚本将在python3解释器上运行,反之亦然。python2.3及以上版本使用Mersenne Twister生成器,它独立于系统随机函数(作为Python的C扩展模块实现)。对于使用Mersenne Twister的任何版本,在不同版本和平台上的结果应该是相同的 以前,您可以使用
WichmannHill
生成器保证向后兼容性,但不幸的是,它似乎已在Python3.x中删除
如果您确实需要保证兼容性,请按照Random
文档的建议编写自己的Random
子类(或使用稳定的外部实现,例如):
如果您想使用自己设计的另一个基本生成器,还可以将类Random子类化:在这种情况下,重写Random()、seed()、getstate()、setstate()和jumpahead()方法。或者,新的生成器可以提供getrandbits()方法—这允许randrange()在任意大的范围内生成选择
您可以使用该模块,该模块具有独立于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
它没有说明python3.x和python3.y在哪里=y将产生相同的结果如果文档没有声明结果保证在python版本中是相同的,那么这不是API的一部分,依赖它是不正确的。或者,至少,我是这么想的。尽管如此,提到算法的事实可能会让你提出问题。