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,属于另一类现代生成器。选择时应关注:周期长度、状态大小、是否支持并行流、是否可复现。

伪随机数生成链路与质量把关 种子 Seed 固定值 / 时间戳 生成器算法 LCG:X=(aX+c) mod m MT19937:状态旋转+回火 U(0,1) 序列 母随机数 分布变换 逆变换 / Box-Muller 拒绝采样 质量检验 均匀性 χ² 检验 · 游程检验 · 自相关 · 谱测试 周期长度 · 低位随机性 · 高维均匀性 判定 通过 → 进入仿真 失败 → 换参数/换算法 种子管理 记录 · 复现 并行流隔离 关键原则:种子决定可复现性;算法决定统计质量;检验决定是否可信;三者缺一不可。 并行仿真时,每个独立流应使用不同且互不重叠的种子或子流,避免流间相关。

四、随机数质量检验:不能只看“像不像随机”

伪随机数序列看起来杂乱,并不等于统计性质合格。工程上通常从以下几个维度检验:

  • 均匀性检验:将 [0,1) 划分为 k 个等宽区间,统计落入各区间的频数,用 χ² 统计量判断是否显著偏离均匀分布。
  • 独立性检验:包括游程检验(观察连续上升/下降或正负号的游程长度分布)、自相关检验(滞后若干阶的相关系数是否接近 0)。
  • 高维均匀性:谱测试用于检测 LCG 类生成器在多维空间中点落在少数超平面上的问题。
  • 周期与低位质量:检查实际周期是否达到理论值,以及低位比特是否具有明显规律。

以 χ² 均匀性检验为例,假设取 n = 10000 个样本、k = 10 个区间,则每区间期望频数 E = 1000。若某次统计得到 χ² = 9.8,自由度 df = k−1 = 9,在显著性水平 α = 0.05 下临界值约为 16.92,9.8 小于临界值,不能拒绝“均匀”的原假设。这只是示例计算,实际检验应结合多组样本与多种检验方法综合判断。

五、种子管理:让仿真可复现、可审计

种子是伪随机数序列的“身份标识”。同一个种子必然产生同一序列,这正是仿真可复现的基础。实践中应做到:

  1. 显式记录种子:每次仿真运行都把种子写入日志或结果元数据,便于事后复现与审计。
  2. 避免隐式使用系统时间:除非确实需要每次不同的随机流,否则不要用时间戳做默认种子。
  3. 并行流隔离:多线程或多进程仿真时,为每个流分配独立种子或使用支持子流的生成器(如 PCG 的 jump 机制),防止流间重叠导致相关性。
  4. 种子与场景绑定:对比实验应固定种子,只改变待研究参数,从而把随机波动与参数效应分离。
建议在仿真项目中维护一张“种子登记表”:记录运行编号、种子值、生成器类型、样本量、对应场景。这样任何一次结果都能被精确重放,也便于排查“结果异常究竟来自模型还是随机波动”。

综合来看,均匀随机数生成器的选择与使用是一条完整链路:选对算法(LCG 适合轻量场景,MT19937 适合通用仿真)、用对参数、做足检验、管好种子。只有这四步都落实,蒙特卡洛仿真得到的估计量与置信区间才真正可信。