8

是否保证带有随机生成器的 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 解释器上运行,反之亦然。

4

2 回答 2

7

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

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

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

如果您想使用您自己设计的不同基本生成器,也可以将类 Random 子类化:在这种情况下,覆盖 random()、seed()、getstate()、setstate() 和 jumpahead() 方法。可选地,一个新的生成器可以提供一个 getrandbits() 方法——这允许 randrange() 在任意大的范围内产生选择。

于 2012-09-16T19:49:38.447 回答
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
于 2012-09-16T20:08:16.903 回答