【问题标题】:About Mersenne Twister generator's period关于 Mersenne Twister 发电机的时期
【发布时间】:2013-11-22 09:20:15
【问题描述】:

我读过 Mersenne Twister 发生器的周期为 2¹⁹⁹³⁷ - 1,但我很困惑为什么会这样。我看到了 Mersenne Twister 算法的this implementation,在第一条评论中它清楚地说它产生的值在 0 到 2³² - 1 的范围内。因此,在它产生 2³² - 1 个不同的随机数之后,它必然会回到起点(种子),所以周期最大可以是 2³² - 1。

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

【问题讨论】:

  • MT19937 有 624 字节的状态,因此 u.it 可以放入单个块中。而你所说的这种种子包装只适用于线性同余生成器,而 MT 则不然。

标签: random mersenne-twister


【解决方案1】:

您的困惑源于认为 PRNG 的输出编号和内部状态必须是同一件事。

一些非常古老的 PRNG 曾经这样做,例如线性同余生成器。在这些生成器中,电流输出被反馈到生成器中以进行下一步。

但是,包括 Mersenne Twister 在内的大多数 PRNGS 都在更大的状态下工作,它会更新并使用它来生成 32 位数字(为此目的,执行的顺序并不重要回答)。

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

【讨论】:

    【解决方案2】:

    你错了

    因此,在它产生了 2³² - 1 个不同的随机数之后,它 必然会回到起点(种子)……

    没错,下一个数字可以与已经生成的数字中的一个相同,但是随机数生成器的内部状态不会相同。 (没有人告诉你,2³² - 1 范围内的每个数字都将在第 2³² - 1 步生成。)所以生成的随机数和生成器的内部状态之间没有双射。生成的随机数可以从状态中计算出来,但您甚至不必这样做。您也可以在不创建随机数的情况下步进内部状态。

    当然,计算机不会存储整个数字序列。它从内部状态计算随机数。考虑一个像 1, -1, 1, -1 ... 这样的数字序列,您可以生成第 N 个数字,而无需存储 N 个元素的数量。

    【讨论】:

    • 您好,谢谢您的回答。不幸的是,我认为我不够清楚,或者我根本不明白你的答案。让我用一个非常简单的例子来解释。假设我们有以下一组数字:N = {1, 2, 3} 并且我们有一个周期为 5 的 PRNG,也就是说,独立于其内部状态,它最多可以输出 5 个不同的数字(这是我对“句号”的理解)。如果我们将此 PRNG 应用于 N,如果 N 只有 3 个,它怎么能产生 5 个不同的元素?现在将“3”替换为“2³² - 1”,将“5”替换为“2¹⁹⁹³⁷ - 1”;这是我真正的疑问。
    • 或者您可能是说 MT19937 可以有 2¹⁹⁹³⁷ - 1 个不同的状态(不一定是 2¹⁹⁹³⁷ - 1 个不同的输出)?然后我就会明白一切,因为正如你所说,输出数和生成器的内部状态之间没有双射。
    • @DanielMuñozParsapoormoghadam 我认为您对“期间”的含义感到困惑。周期定义了序列何时重复,而不是它可以产生的“最大不同数量”。因此,使用您的示例 PRNG,它将产生 5 个数字,每个数字都在集合 {1,2,3} 中,然后它将继续一遍又一遍地产生相同的 5 个数字。
    • @DanielMuñozParsapoormoghadam 是的,MT19937 可以有这么多状态。在内部,状态存储在 624 个 32 位字中。 624 * 32 = 19968 位,其中 31 位未使用,给您 19937 位已使用的位。
    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2013-06-11
    • 2017-04-05
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多