(点击上方公众号,可快速关注)
如需转载,发送「转载」二字查看说明
本文是为了记录和澄清一个由来已久的关于C语言随机数生成器的误解。
目前所看到的所有公开的关于C随机数生成器的中文资料,都提到经典的线性同余法( LCG, linear congruential generator),并认为是默认的实现方法。这个说法并不准确。以GCC为例,GLIBC的确实现了线性同余法,但是实现的代码块分支在日常使用中不会执行到,线性同余法为C语言默认随机数生成器的说法已过时。
本文将以GLIBC源代码为例,结合掌握的文档,做一回搬运工,总结描述一下GLIBC中随机数生成器的实现。
线性同余法
线性同余法,LCG(linear congruential generator),是经典的伪随机数产生器算法,速度快,容易理解实现。 LCG 算法数学上基于公式:
X(n+1) = (a * X(n) + c) % m
其中,各系数为:模m, 系数a, 0 < a < m,增量c, 0 <= c < m,原始值(种子) 0 <= X(0) < m 。其中参数c, m, a比较敏感,或者说直接影响了伪随机数产生的质量。
GLIBC中对LCG的实现,取a = 1103515245, c = 12345, m = 134217728,即
X(n+1) = (1103515245 * X(n) + 12345) & 2147483647
由于LCG计算简单,极省内存,很适合内存和