我已经读到Mersenne Twister发电机的周期是2¹⁹⁹³⁷ - 1,但我很困惑为什么这是可能的。我看到Mersenne Twister算法的this implementation,并且在第一个注释中它清楚地表明它产生0到2³²-1范围内的值。因此,在产生2 32 2 -1个不同的随机数之后,它必然会出现回到起点(种子),所以时间最长可达2³² - 1.
另外(并告诉我,如果我错了,请),计算机不能保存数字(2¹⁹⁹³⁷ - 1)~4.3×10⁶⁰⁰¹,至少在一块内存中。我在这里缺少什么?
答案 0 :(得分:4)
您的困惑源于认为PRNG的输出数量和内部状态必须相同。
一些非常古老的PRNG用来做这件事,例如线性同步发生器。在这些发电机中,电流输出被反馈到发电机中以进行下一步。
然而,大多数PRNGS,包括Mersenne Twister,都是在一个更大的状态下工作,它会更新并用于生成一个32位的数字(为了达到这个目的,这样做的顺序并不重要这个答案)。
事实上,Mersenne Twister确实存储了624次32位值,这是19968位,足以包含您想知道的很长一段时间。这些值是单独处理的(作为无符号32位整数),在单步计算中不被视为一个巨号。从输出中获得的32位随机数与相关到此状态,但不会自行确定下一个数字。
答案 1 :(得分:2)
你错了
因此,在它产生了2³² - 1个不同的随机数后,它 必然会回到起点(种子)......
这是正确的,下一个数字可以与已生成的数字之一相同,但随机数生成器的内部状态将不相同。 (没有人告诉你,2³² - 1范围内的每个数字都会产生2 2,3 - 1步。)因此,生成的随机数和发生器的内部状态之间没有双射。生成的随机数可以从州计算,但您甚至不必这样做。您也可以在不创建随机数的情况下执行内部状态。
当然,计算机不存储整数序列。它从内部状态计算随机数。考虑一个数字序列,如1,-1,1,-1 ...您可以生成第N个数字而不存储N个元素的数量。