【问题标题】:How is the lagged fibonacci generator random?滞后的斐波那契生成器如何随机?
【发布时间】:2011-01-22 14:02:27
【问题描述】:

我不明白。如果它有一个固定的长度,一遍又一遍地选择滞后和 mod 会给出相同的数字,不是吗?

【问题讨论】:

  • number[i+1] == number[i]中的数字相同吗?还是你的意思是别的?

标签: c random numbers


【解决方案1】:

准确地说,滞后斐波那契是一个-随机数生成器。这不是真正的随机,但它比更常用的linear congruential generator(C++、Java 等的标准生成器)好多。我不知道你为什么认为它会再次给出相同的数字,但确实像所有伪随机数生成器一样,它有一个句点,之后数字序列将再次重复.

乘法 LFG 的周期为 (2^k - 1)*2^(M-3)。对于实际参数,这个其实是相当大的(LCG的周期只有M)。

LFG 的唯一问题是初始化过程非常复杂,而且其背后的数学不完整。最好查阅文献,了解正确播种的参数选择和推荐程序。

作为示例,带有参数 (j=31, k=52) 和模数 m=2^32 的乘法 LFG 以 52 个 32 位数字的数组为种子。


其他参考资料:

【讨论】:

  • 初始化复杂?我认为这就像选择 Kudth 推荐的 (p,q) 对一样简单。可能有足够大的此类对表。
  • 选择 (p,q) 只是修复“引擎”。你用 q 个数的种子“运行”它,必须明智地选择它。这些数字中至少有一个必须是奇数。事实上,如果我没记错的话,如果你使用乘法 LFG,我认为它们都必须是奇数。还有很多可能的种子可供选择,因此您的选择不受限制,您只需谨慎选择即可。传统上,种子是使用另一个生成器生成的,例如 LCG。
【解决方案2】:

不是随机的,是pseudorandom

来自http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator

如果使用加法或减法,滞后斐波那契生成器的最大周期为 (2^k - 1)*2^(M-1),如果使用异或运算来组合,则最大周期为 (2^k-1)以前的值。另一方面,如果使用乘法,则最大周期为 (2^k - 1)*2^(M-3),即加法情况的 1/4。

所以,给定一个种子值,输出值的序列是可预测和可重复的,并且有一个循环。如果您等待足够长的时间,它会重复 - 但周期非常大。

对于不知道种子值的观察者来说,序列似乎是非常随机的,因此它可以用作模拟和其他不需要真正随机性的情况的“随机性”来源。

【讨论】:

  • 澄清一下,我们所说的种子值是 (31,52), (24,55), (31,55), (7,57), (50,57) ...等等?因此,为了让它看起来是随机的,我们需要一个新的 (p,q) 对?
  • 您列出的那些对不是种子。它们是(j, k) 参数。
  • @chester.boo:这些是 j & K 的值,它们控制周期的顺序和长度。它们并不是你通常所说的“种子”值,尽管改变它们会改变输出。您还可以通过在给定序列中选择不同的位置来更改输出。
  • 文章中的注释 Freeciv 使用滞后的斐波那契生成器,其随机数生成器为 {j = 24, k = 55}。 因此,对于该实现,j 和 k 是固定,种子只是起点。
  • 我可以看出我误解了种子是什么。什么是种子值或如何为 LFG 选择种子值?
【解决方案3】:

它是随机的,就像任何伪随机数生成器一样——也就是说,根本不是。

但是,滞后斐波那契(以及所有线性反馈移位寄存器 PRNG)通过增加状态大小来改进基本的线性同余生成器。也就是说,下一个值取决于几个以前的值,而不仅仅是前一个值。结合一个不错的种子,您应该能够获得相当不错的结果。

编辑:

从您的帖子中,不清楚您是否了解底层状态存储在移位寄存器中,这意味着它不是静态的而是更新的(通过将每个值向左移动一位,删除最左边的值,并在每次抽奖后在右侧附加最近的值)。这样,就可以避免一遍又一遍地绘制相同的数字(至少对于大多数种子值而言)。

【讨论】:

    【解决方案4】:

    这一切都取决于种子。大多数随机数生成器都会为固定种子值提供相同的数字序列。

    【讨论】:

    • all pseudorandom 数字生成器为固定种子值提供相同的数字序列...否则它们将是真正的随机而不是伪随机。
    • @Tyler 我对这个评论投了赞成票,但你让它听起来好像不是定期的就足以是随机的,但事实并非如此(pi 的小数点不是随机的)。曾经有人向我展示了随机性的一个很好的定义,即无限字符串前缀的 Kolmogorov 复杂性的渐近演化,但我在网上找不到参考。
    【解决方案5】:

    随机数生成器通常是一对一的函数,其中每个输入都有一个恒定的输出。要使其“随机”,您必须为其提供种子(必须是“随机”),例如系统时间或计算机内存位置的值。

    如果您想知道为什么不直接使用种子(时间等),那是因为时间是连续的 (1,2,3,4),而大多数伪随机数生成器会输出数字看起来是随机的 (8, 27, 13, 1)。这样,如果您在循环中生成伪随机数(发生得非常快),您将不会只是得到 {1,2,3,4}...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多