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

时间:2010-03-02 04:24:08

标签: c random numbers

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

5 个答案:

答案 0 :(得分:9)

准确地说,滞后的Fibonacci是 - 随机数生成器。这不是真正的随机,但它比其他更常用的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位数字的数组播种。


其他参考资料:

答案 1 :(得分:4)

它不是随机的,pseudorandom

从此http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator

  

如果使用加法或减法,滞后Fibonacci生成器的最大周期为(2 ^ k - 1)* 2 ^(M-1),如果使用异或运算,则(2 ^ k-1)以前的值。另一方面,如果使用乘法,则最大周期为(2 ^ k - 1)* 2 ^(M-3),或者是附加情况周期的1/4。

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

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

答案 2 :(得分:2)

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

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

编辑:

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

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