C 滞后斐波那契发生器是如何随机的?

C 滞后斐波那契发生器是如何随机的?,c,random,numbers,C,Random,Numbers,我不明白。如果它有一个固定的长度,反复选择滞后和模将给出相同的数字,否?这取决于种子。大多数随机数生成器确实为固定种子值提供相同的数字序列。它的随机性与任何伪随机数生成器的随机性相同,也就是说,根本不是 然而,滞后斐波那契(和所有线性反馈移位寄存器PRNG)通过增加状态大小改进了基本线性同余生成器。也就是说,下一个值取决于前几个值,而不仅仅是前一个值。再加上一颗像样的种子,你应该能够得到相当像样的结果 编辑: 从您的帖子中,不清楚您是否理解底层状态存储在移位寄存器中,这意味着它不是静态的,而是在

我不明白。如果它有一个固定的长度,反复选择滞后和模将给出相同的数字,否?

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

它的随机性与任何伪随机数生成器的随机性相同,也就是说,根本不是

然而,滞后斐波那契(和所有线性反馈移位寄存器PRNG)通过增加状态大小改进了基本线性同余生成器。也就是说,下一个值取决于前几个值,而不仅仅是前一个值。再加上一颗像样的种子,你应该能够得到相当像样的结果

编辑:


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

准确地说,滞后斐波那契是一个伪随机数生成器。它不是随机的,但它比通常使用的(C++的标准生成器、java等)要好得多。我不确定你为什么认为它会再次给出相同的数字,但它确实像所有伪随机数生成器一样,有一个周期,在这个周期之后,数字序列会再次重复

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

LFG的唯一缺点是初始化过程非常复杂,其背后的数学模型也不完整。最好查阅文献,以便选择合适的参数和推荐的正确播种程序

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


其他参考资料:

  • 有关该生成器和种子算法的更多详细信息,请参阅Mascagni等人的论文

这不是随机的,而是随机的

由此

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

因此,给定某个种子值,输出值的序列是可预测和可重复的,并且它有一个循环。如果你等待的时间足够长,它会重复——但周期相当大


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

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


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

number[i+1]==number[i]
中相同的数?或者你的意思是什么?所有的伪随机数生成器对于一个固定的种子值给出相同的数字序列。。。否则它们将是真正随机的,而不是伪随机的。@Tyler我投票支持这个评论,但你让它听起来好像没有周期性就足以成为随机的,事实并非如此(π的小数不是随机的)。我曾经被展示过一个很好的随机性定义,它是关于无限字符串前缀的Kolmogorov复杂性的渐近演化,但是我在网上找不到一个参考。只是澄清一下,我们谈论的种子值就像(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的种子值是多少?如何选择?初始化很复杂?我想这就像选择Kudth推荐的(p,q)对一样简单。可能有一个足够大的表,包含这样的对。选择(p,q)只是修复“引擎”。你“运行”它与种子的q数,这必须是明智的选择。这些数字中至少有一个必须是奇数。事实上,如果我没记错的话,我想如果你用的是乘法LFG,它们都是奇数。还有很多可能的种子可供选择,所以你的选择并不局限于此,你只需要小心选择。传统上,种子由另一个生成器生成,如LCG。