关于Mersenne Twister发电机的时期

时间:2013-11-22 09:20:16

标签: random mersenne-twister

我已经读到Mersenne Twister发电机的周期是2¹⁹⁹³⁷ - 1,但我很困惑为什么这是可能的。我看到Mersenne Twister算法的this implementation,并且在第一个注释中它清楚地表明它产生0到2³²-1范围内的值。因此,在产生2 32 2 -1个不同的随机数之后,它必然会出现回到起点(种子),所以时间最长可达2³² - 1.

另外(并告诉我,如果我错了,请),计算机不能保存数字(2¹⁹⁹³⁷ - 1)~4.3×10⁶⁰⁰¹,至少在一块内存中。我在这里缺少什么?

2 个答案:

答案 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个元素的数量。