Random 关于Mersenne捻线机生成器';s周期

Random 关于Mersenne捻线机生成器';s周期,random,mersenne-twister,Random,Mersenne Twister,我读过Mersenne捻线发生器的周期为2⁹⁹³⁷ - 但是我不明白为什么会这样。我看到了Mersenne Twister算法的一个例子,在第一条评论中,它清楚地表明它产生的值在0到2-1之间。因此,在它产生2²-1个不同的随机数后,它必然会返回到起始点(种子),因此周期最大为2²-1 另外(如果我错了,请告诉我),计算机无法保存数字(2)⁹⁹³⁷ - 1) ~ 4.3×10⁶⁰⁰至少在单个内存块中。我错过了什么?你错了 因此,在它产生2-1个不同的随机数之后 一定会回到起点(种子) 没错,下一

我读过Mersenne捻线发生器的周期为2⁹⁹³⁷ - 但是我不明白为什么会这样。我看到了Mersenne Twister算法的一个例子,在第一条评论中,它清楚地表明它产生的值在0到2-1之间。因此,在它产生2²-1个不同的随机数后,它必然会返回到起始点(种子),因此周期最大为2²-1

另外(如果我错了,请告诉我),计算机无法保存数字(2)⁹⁹³⁷ - 1) ~ 4.3×10⁶⁰⁰至少在单个内存块中。我错过了什么?

你错了

因此,在它产生2-1个不同的随机数之后 一定会回到起点(种子)

没错,下一个数字可以与已经生成的数字中的一个相同,但随机数生成器的内部状态将不同。(Noone告诉过您,2²-1范围内的每个数字都将在第2²-1步生成。)因此生成的随机数与生成器的内部状态之间没有双射。生成的随机数可以根据状态计算,但您甚至不必这样做。也可以单步执行内部状态,而无需创建随机数


当然,计算机不会存储整个数字序列。它根据内部状态计算随机数。考虑一个数字序列,比如1,1, 1,1…您可以在不存储N个元素的情况下生成第N个数字。

您的困惑源于认为PRNG的输出数字和内部状态必须是相同的

一些非常古老的PRNG用于此,例如线性同余生成器。在这些发电机中,电流输出被反馈到发电机中,供下一步使用

然而,大多数PRNG,包括Mersenne Twister,都是从一个更大的状态开始工作的,它会更新并使用这个状态生成一个32位的数字(对于这个答案来说,以哪个顺序进行并不重要)


事实上,Mersenne Twister确实存储了624乘以32位的值,也就是19968位,足以包含您想知道的非常长的周期。这些值单独处理(作为无符号32位整数),而不是在单步计算中作为一个巨数处理。从输出中获得的32位随机数与此状态相关,但不能自行确定下一个数字。

MT19937具有624字节的状态,因此u可以放入单个块中。你说的这个种子包装只适用于线性同余生成器,而MT不是。嗨,谢谢你的回答。不幸的是,我想我还不够清楚,或者我根本不明白你的答案。让我用一个非常简单的例子来解释。假设我们有以下一组数字:N={1,2,3},我们有一个周期为5的PRNG,也就是说,独立于它的内部状态,它最多可以输出5个不同的数字(这就是我所理解的“周期”)。如果我们把这个PRNG应用于N,如果N只有3个元素,它怎么能产生5个不同的元素呢?现在将“3”替换为“2-1”,将“5”替换为“2”⁹⁹³⁷ - 1"; 这是我真正的怀疑。或者你是说MT19937可以有2⁹⁹³⁷ - 1个不同的州(不一定是2个州)⁹⁹³⁷ - 1不同的产出?然后我会理解一切,因为正如你所说,在输出数和发生器的内部状态之间没有双射。@DanielMuñozparsapormoghadam我想你对“周期”的含义感到困惑。周期定义了序列重复的时间,而不是它能产生的“最大不同数”。因此,使用您的示例PRNG,它将生成5个数字,每个数字都在集合{1,2,3}中,然后它将不断重复生成相同的5个数字。@DanielMuñozparsapormoghadam,是的,MT19937可以有这么多状态。在内部,状态存储在624个32位字中。624*32=19968位,其中31位未使用,即19937位已使用。