【发布时间】:2011-01-22 14:02:27
【问题描述】:
我不明白。如果它有一个固定的长度,一遍又一遍地选择滞后和 mod 会给出相同的数字,不是吗?
【问题讨论】:
-
与
number[i+1] == number[i]中的数字相同吗?还是你的意思是别的?
我不明白。如果它有一个固定的长度,一遍又一遍地选择滞后和 mod 会给出相同的数字,不是吗?
【问题讨论】:
number[i+1] == number[i]中的数字相同吗?还是你的意思是别的?
准确地说,滞后斐波那契是一个伪-随机数生成器。这不是真正的随机,但它比更常用的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 位数字的数组为种子。
其他参考资料:
可以在 Mascagni 等人的论文中找到有关此生成器和播种算法的更多详细信息。
【讨论】:
不是随机的,是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。
所以,给定一个种子值,输出值的序列是可预测和可重复的,并且有一个循环。如果您等待足够长的时间,它会重复 - 但周期非常大。
对于不知道种子值的观察者来说,序列似乎是非常随机的,因此它可以用作模拟和其他不需要真正随机性的情况的“随机性”来源。
【讨论】:
(j, k) 参数。
它是随机的,就像任何伪随机数生成器一样——也就是说,根本不是。
但是,滞后斐波那契(以及所有线性反馈移位寄存器 PRNG)通过增加状态大小来改进基本的线性同余生成器。也就是说,下一个值取决于几个以前的值,而不仅仅是前一个值。结合一个不错的种子,您应该能够获得相当不错的结果。
编辑:
从您的帖子中,不清楚您是否了解底层状态存储在移位寄存器中,这意味着它不是静态的而是更新的(通过将每个值向左移动一位,删除最左边的值,并在每次抽奖后在右侧附加最近的值)。这样,就可以避免一遍又一遍地绘制相同的数字(至少对于大多数种子值而言)。
【讨论】:
这一切都取决于种子。大多数随机数生成器都会为固定种子值提供相同的数字序列。
【讨论】:
随机数生成器通常是一对一的函数,其中每个输入都有一个恒定的输出。要使其“随机”,您必须为其提供种子(必须是“随机”),例如系统时间或计算机内存位置的值。
如果您想知道为什么不直接使用种子(时间等),那是因为时间是连续的 (1,2,3,4),而大多数伪随机数生成器会输出数字看起来是随机的 (8, 27, 13, 1)。这样,如果您在循环中生成伪随机数(发生得非常快),您将不会只是得到 {1,2,3,4}...
【讨论】: