时滞斐波那契生成器

时滞斐波那契生成器（，简称：LFG或LFib），是一类伪随机数生成器。用于改进标准的线性同余生成器。

用递推关系表示序列的生成：

其中，新项由两个老项计算生成。m通常是2的幂 (m = 2M), 经常232或264。其中 算符表示一般的二元运算符，这可以是加法、减法、乘法或者位运算异或。相应地称作加法时滞斐波那契生成器（ALFG）、乘法时滞斐波那契生成器（MLFG）、 双抽头广义反馈移位寄存器（GFSR）。梅森旋转算法是GFSR的变种。GFSR与线性反馈移位寄存器有关。

使用k个状态字的生成器，称作'记住'了过去k个值。

时滞斐波那契生成器的理论相当复杂，理论也不够充分到能指导如何选择与。生成器的初始化也非常敏感。 
性值 
时滞斐波那契生成器对于加减法运算，有最大周期(2k - 1)*2M-1；对异或运算有最大周期(2k − 1) × k；对乘法运算的最大周期为(2k − 1) × 2M−3, 即加法运算最大周期的1/4.

为了达到最大周期，多项式:

y = xk + xj + 1

必须是，对于mod 2的整数. 满足这样的约束的j与k，已经在文献中公布，常用的有:

{j = 7, k = 10},  {j = 5, k = 17},  {j = 24, k = 55},  {j = 65, k = 71},  {j = 128, k = 159}  , {j = 6, k = 31}, {j = 31, k = 63}, {j = 97, k = 127}, {j = 353, k = 521}, {j = 168, k = 521}, {j = 334, k = 607}, {j = 273, k = 607}, {j = 418, k = 1279}  

另一套j与k的可能值在《计算机程序设计艺术》第2卷第29页公布:

(24, 55), (38, 89), (37, 100), (30, 127), (83, 258), (107, 378), (273, 607), (1029, 2281), (576, 3217), (4187, 9689), (7083, 19937), (9739, 23209)

注意到上述数越小，周期就越短。

如果使用加法，要求前k个初始化生成器的值中至少一个是奇数。如果使用乘法，要求前k个值都必须是奇数.Parameterizing Parallel Multiplicative Lagged-Fibonacci Generators , M.Mascagni, A.Srinivasan

有研究建议与最好近似黄金比例."Uniform random number generators for supercomputers" , Richard Brent, 1992

 时滞斐波那契生成器的问题 
Robert M. Ziff在四抽头移位寄存器的论文中指出“众所周知这种生成器，特别是双抽头的 R(103, 250)，有严重的缺陷。发现R(24, 55)与更小的生成器的作为相当差，并建议不要用这类生成器。 ... 双抽头生成器R(a, b)的基础问题是给定了生成器，则有内在的三点相关：, , 。这种相关性在尺度上传播，显然导致了问题。”"Four-tap shift-register-sequence random-number generators" , Robert M. Ziff, Computers in Physics, 12(4), Jul/Aug 1998, pp. 385–392这是指标准的时滞斐波那契生成器，每个新数依赖于以前的2个老数。三抽头的时滞斐波那契生成器去除了很多统计问题，如在与Generalized Triple测试失败问题.

时滞斐波那契生成器的初始化是个非常复杂的问题。时滞斐波那契生成器的输出对其初始化条件非常敏感。时滞斐波那契生成器的数学理论是不完备的，使它依赖于统计测试而不是理论分析。

 使用 
 Freeciv游戏使用时滞斐波那契生成器{j = 24, k = 55}。
 Boost C++ Libraries实现了时滞斐波那契生成器。
 Subtract with carry是时滞斐波那契生成器的一种实现，包含在C++11标准模板库中。
 Oracle数据库在DBMS_RANDOM包中实现了时滞斐波那契生成器。

 参考文献
Toward a universal random number generator, G.Marsaglia, A.Zaman


Category:伪随机数生成器
Category:斐波那契数