python随机模块的内部状态

时间:2017-04-08 02:15:25

标签: python random

import random
random.seed(234)
state = random.getstate()

结果状态是一个元组:

(3, (.... many long integers...),  None)

这到底是什么意思?我知道我可以保存状态并使用random.setstate(state)来恢复此模块中使用的任何随机数生成器的内部状态。但我不知道州内的这些价值是什么意思。官方文件没有说明任何细节。我想这可能意味着用于确定随机状态的参数。

1 个答案:

答案 0 :(得分:1)

自Python 2.3以来使用的算法是Mersenne Twisterdocs注意到状态是特定于实现的。除非你真的需要,否则我不会依赖国家的任何特定细节。

Mersenne Twister首先使用种子初始化一个整数数组。这是来自维基百科关于Mersenne Twister的文章的一个有用(略微编辑)的Python代码片段:

    state = [0] * 624
    state[0] = seed
    for i in range(1, 624):
        state[i] = int(
            0xFFFFFFFF & (1812433253 * (state[i - 1] ^ state[i - 1] >> 30) + i)
        )

注意这是无符号位算术。这是用于生成状态的算法,如CPython source code中所示。

CPython代码将624设置为要用作索引变量的状态的最后一个元素,因此状态数组实际上有625个元素,而上面的Wikipedia代码段中有624个元素。 "扭曲" operation使用此索引变量。

当我将使用Python维基百科代码的结果与随机模块进行比较时,我没有得到相同的624个整数。我认为这可能是Python代码没有做与C代码相同的算法和C代码操纵的种子的组合。当我有更多时间时,我会好好看看。