保存时间:2026/3/29 20:48:35
rand()、srand())的实现机制主要基于伪随机数生成算法,核心原理如下:srand()设置不同的种子(通常用当前时间time(NULL))来保证每次运行的序列不同。rand()多数基于线性同余算法,公式为:next = (a * current + c) % m其中:current是当前随机数(初始为种子值);a(乘数)、c(增量)、m(模数)是算法固定参数(不同编译器可能不同,例如glibc中a=1103515245,c=12345,m=2^31);rand()时,用当前值计算下一个值,并返回该值的一部分(如低15位或31位)。arc4random()或系统提供的加密库)。rand()就是通过固定公式,从种子开始一步步计算出下一个“随机数”,本质是可预测的确定性序列。next = (a * current + c) % m生成数字,从初始种子开始,每次计算出下一个数。但由于计算结果始终是0到m-1之间的整数(受模数m限制),生成的数字必然会重复。xₙ₊₁ = (a·xₙ + c) % m,生成的序列落在 [0, m-1] 范围内。要让序列看起来 “随机”,关键是让余数在该范围内均匀分布(即每个数出现的概率近似相等),且相邻元素之间没有明显关联。a, c, m 满足特定条件时,LCG 能达到满周期(周期等于 m),此时序列会遍历 [0, m-1] 中的所有数,且每个数仅出现一次,分布完全均匀。c 与 m 互质(即 gcd(c, m) = 1);m 的所有质因子 p,(a - 1) 能被 p 整除;m 能被 4 整除,则 (a - 1) 也能被 4 整除。m,序列会均匀覆盖 [0, m-1] 中的所有数,此时余数的分布在周期内是完全均匀的,统计学上接近 “等概率出现”。1/m(即等概率);