2. 随机数与伪随机数生成
蒙特卡洛仿真的全部结论,最终都建立在“随机数”这一基础原料之上。若把仿真模型比作一台机器,随机数就是它的燃料:燃料不纯,机器再精密也输出不了可信结果。本节围绕四个关键问题展开:均匀随机数生成器的原理、线性同余法、梅森旋转算法,以及随机数质量检验与种子管理。
一、均匀随机数生成器在做什么
严格意义上的真随机数来自物理过程(热噪声、放射性衰变等),而计算机仿真中使用的绝大多数是伪随机数:由一个确定性算法,从一个初始状态(种子)出发,递推产生一列看似随机的数。其核心要求是:序列在统计上近似独立同分布的 U(0,1) 均匀分布,同时具有足够长的周期、可复现性和可移植性。
均匀随机数是“母随机数”。任意分布的抽样都可由它变换得到:逆变换法用 X = F⁻¹(U),Box-Muller 法用两个均匀数生成正态变量,拒绝采样法用均匀数做候选与判据。因此,均匀随机数生成器(Uniform Random Number Generator, URNG)的质量,直接决定后续所有分布抽样的质量。
二、线性同余法:最经典的递推结构
线性同余法(LCG)的递推式为:
X(n+1) = (a * X(n) + c) mod m
U(n+1) = X(n+1) / m
其中 m 为模数,a 为乘子,c 为增量,X(0) 为种子。当 c = 0 时称为乘同余法。LCG 的优点是实现极简、速度快、状态只需一个整数;缺点是周期受 m 限制,低位比特随机性差,且在高维空间中点会落在少数超平面上(谱测试可检测),因此不适合对多维均匀性要求高的仿真。
参数选择有明确准则。以常见的 m = 2³¹ 为例,可取 a = 1103515245、c = 12345,此时周期为 2³¹。若希望周期更长,可使用 m = 2⁶⁴ 的 64 位版本。需要强调的是:不要自行随意挑选 a、c、m,应使用经过检验的经典参数组合,否则可能出现周期骤减或相关性严重的问题。
三、梅森旋转算法:现代仿真的默认选择
梅森旋转算法(Mersenne Twister,MT19937)是目前应用最广的伪随机数生成器之一。它基于 32 位字长的状态向量(共 624 个字),周期为 2¹⁹⁹³⁷−1,这是一个梅森素数,故得名。其核心操作是“旋转”:将状态字按位拼接后,用掩码提取高位与低位,再经过条件异或与矩阵乘(通过移位异或实现),生成新的状态字并输出经过 tempering(回火)变换的 32 位整数。
MT19937 的优点是周期极长、在 623 维以内具有较好的均匀性、速度快;缺点是状态较大(约 2.5 KB),且不具备密码学安全性——给定足够多的输出可反推内部状态。因此在仿真场景中它非常合适,但不应被用于安全相关的随机数需求。
实际使用中,Python 的 random 模块、NumPy 的 RandomState 均基于 MT19937;而 NumPy 新版的 default_rng 默认使用 PCG64,属于另一类现代生成器。选择时应关注:周期长度、状态大小、是否支持并行流、是否可复现。
四、随机数质量检验:不能只看“像不像随机”
伪随机数序列看起来杂乱,并不等于统计性质合格。工程上通常从以下几个维度检验:
- 均匀性检验:将 [0,1) 划分为 k 个等宽区间,统计落入各区间的频数,用 χ² 统计量判断是否显著偏离均匀分布。
- 独立性检验:包括游程检验(观察连续上升/下降或正负号的游程长度分布)、自相关检验(滞后若干阶的相关系数是否接近 0)。
- 高维均匀性:谱测试用于检测 LCG 类生成器在多维空间中点落在少数超平面上的问题。
- 周期与低位质量:检查实际周期是否达到理论值,以及低位比特是否具有明显规律。
以 χ² 均匀性检验为例,假设取 n = 10000 个样本、k = 10 个区间,则每区间期望频数 E = 1000。若某次统计得到 χ² = 9.8,自由度 df = k−1 = 9,在显著性水平 α = 0.05 下临界值约为 16.92,9.8 小于临界值,不能拒绝“均匀”的原假设。这只是示例计算,实际检验应结合多组样本与多种检验方法综合判断。
五、种子管理:让仿真可复现、可审计
种子是伪随机数序列的“身份标识”。同一个种子必然产生同一序列,这正是仿真可复现的基础。实践中应做到:
- 显式记录种子:每次仿真运行都把种子写入日志或结果元数据,便于事后复现与审计。
- 避免隐式使用系统时间:除非确实需要每次不同的随机流,否则不要用时间戳做默认种子。
- 并行流隔离:多线程或多进程仿真时,为每个流分配独立种子或使用支持子流的生成器(如 PCG 的 jump 机制),防止流间重叠导致相关性。
- 种子与场景绑定:对比实验应固定种子,只改变待研究参数,从而把随机波动与参数效应分离。
综合来看,均匀随机数生成器的选择与使用是一条完整链路:选对算法(LCG 适合轻量场景,MT19937 适合通用仿真)、用对参数、做足检验、管好种子。只有这四步都落实,蒙特卡洛仿真得到的估计量与置信区间才真正可信。