LCG
线性同余生成器(Linear Congruential Generator, 简称 LCG)是计算机科学中最古老且最广为人知的伪随机数生成算法之一。其核心优势在于极高的计算效率和极小的内存占用,但由于其数学特性的限制,生成的随机数序列在统计学上存在固有缺陷,不适用于密码学或高精度的科学模拟。
一、 核心数学模型
LCG 基于一个简单的线性递推关系式,并通过取模运算将其结果限制在一个固定的范围内。其递推公式定义如下:
参数解析:
-
\(X\):伪随机数序列。
-
\(X_0\):种子 (Seed),即序列的初始值,需满足 \(0 \le X_0 < m\)。种子的选择决定了整个序列的起始点。
-
\(m\):模数 (Modulus),决定了生成随机数的最大范围(生成的数值在 \(0\) 到 \(m-1\) 之间),需满足 \(m > 0\)。通常选择 \(2\) 的幂(如 \(2^{32}\) 或 \(2^{64}\))以便于计算机底层进行位截断优化。
-
\(a\):乘数 (Multiplier),需满足 \(0 < a < m\)。
-
\(c\):增量 (Increment),需满足 \(0 \le c < m\)。当 \(c = 0\) 时,该生成器被称为乘同余生成器 (MCG) 或 Lehmer 随机数生成器。
二、 周期性与 Hull-Dobell 定理
由于 LCG 的状态空间是有限的(最大为 \(m\)),经过一定次数的迭代后,生成的序列必然会发生重复。这个重复的间隔被称为周期。
LCG 的最大可能周期为 \(m\)。为了确保 LCG 能够达到全周期(即在重复前遍历 \(0\) 到 \(m-1\) 的所有整数),参数 \(m\)、\(a\) 和 \(c\) 必须严格满足 Hull-Dobell 定理的三个条件:
-
增量 \(c\) 与模数 \(m\) 互质(即它们的最大公约数为 1,\(\gcd(c, m) = 1\))。
-
对于模数 \(m\) 的每一个质因数 \(p\),\(a - 1\) 必须是 \(p\) 的倍数。
-
如果模数 \(m\) 是 \(4\) 的倍数,那么 \(a - 1\) 也必须是 \(4\) 的倍数。
注:如果 \(c = 0\) (MCG),则无法达到最大周期 \(m\),其最大周期通常为 \(m-1\) 或更小,具体取决于 \(m\) 的素性。
三、 算法的优缺点分析
1. 优势
-
极高的性能: 每次生成仅需一次乘法、一次加法和一次取模(通常被优化为位运算)。
-
极低的状态开销: 只需要保存当前的 \(X_n\)(通常为 32 位或 64 位整数)。
-
易于重现: 只要初始种子 \(X_0\) 相同,生成的序列完全一致,这在程序调试中非常有用。
2. 致命缺陷
-
可预测性(非密码安全): 只要观察到序列中的连续几个输出,通过解线性同余方程组即可轻易反推算出 \(a\)、\(c\) 和 \(m\),从而预测未来的所有随机数。
-
低维空间相关性 (Marsaglia 效应):
如通过谱检验(Spectral Test)将连续的 \(k\) 个随机数作为 \(k\) 维空间中的坐标点 \((X_n, X_{n+1}, \dots, X_{n+k-1})\) 进行绘制,所有的点都会落在数量有限的平行超平面上。这意味着 LCG 在多维空间中存在严重的规律性,无法提供高质量的随机性分布。
-
低位周期短: 当模数 \(m\) 是 \(2\) 的幂时,生成的随机数的低位(右侧位)的周期极短且呈现明显的规律性交替(例如最低位往往是 \(0, 1, 0, 1\) 交替)。
四、 经典应用参数对照表
许多经典的编程语言标准库在早期都采用了 LCG 作为默认的伪随机数生成器。以下是几个著名的参数配置:
| 环境 / 库 | 模数 (m) | 乘数 (a) | 增量 (c) | 结果截取 |
|---|---|---|---|---|
glibc (C 标准库 rand()) |
\(2^{31}\) | \(1103515245\) | \(12345\) | 取位 30..16 |
Java (java.util.Random) |
\(2^{48}\) | \(25214903917\) | \(11\) | 取高位 (通常 32 位) |
| POSIX [c.1990] | \(2^{32}\) | \(1103515245\) | \(12345\) | 取位 30..16 |
| Apple CarbonLib | \(2^{31} - 1\) | \(16807\) | \(0\) (MCG) | 无截取 |
注:现代编程语言由于对随机数质量要求的提升,已逐渐转向更先进的算法(如 Mersenne Twister、Xoshiro256 等),LCG 仅保留在对性能要求极高且对随机质量要求极低的场景中。