1. 课程导入与随机数质量评估概览
在仿真复现中,随机数并不是“随便产生的数”,而是整个实验可重复性的地基。设想你要复现一次排队系统仿真:如果两次运行使用相同的模型参数、相同的初始状态,却得到差异很大的平均等待时间,问题往往不在模型,而在随机数流。随机数发生器(RNG)负责产生均匀分布的基础序列,随机变量生成器再把它变换为指数分布、正态分布等业务所需的分布。只要基础序列可复现、变换过程确定,整条随机数链路就是确定的;反之,任何一处不可控,复现就无从谈起。
因此,本课程把“随机数质量”理解为一条从种子到结果的完整链路,而不是孤立地看某个函数。评估维度可以归纳为四个层面:可复现性(相同种子是否产生相同序列)、统计均匀性(序列是否近似服从 U(0,1) 且无明显相关性)、分布正确性(变换后的样本是否符合目标分布)、工程可用性(周期长度、生成速度、并行流划分是否满足仿真规模)。这四个维度共同决定了随机数能否支撑可信的仿真结论。
上图把“种子—均匀序列—分布变换—仿真模型—结果”这条链路与四个评估维度放在同一视图中。可以看到,可复现性贯穿全链路,而统计均匀性主要针对基础序列,分布正确性针对变换环节,工程可用性则约束发生器本身的选择。理解这张图,就理解了本课程的组织逻辑。
为什么“能跑通”不等于“可复现”
很多初学者用 Python 的 random.random() 或 NumPy 的 np.random.rand() 做仿真,第一次运行结果不错,第二次却变了。常见原因有三类:一是没有显式设置种子;二是混用了全局随机状态与独立生成器;三是并行计算时多个进程共享或错误复制了同一随机流。下面是一段可对照检查的最小示例:
import numpy as np
# 错误做法:依赖全局状态,未固定种子
a = np.random.rand(3)
# 正确做法:使用独立生成器并显式给定种子
rng1 = np.random.default_rng(20240501)
rng2 = np.random.default_rng(20240501)
x = rng1.random(3)
y = rng2.random(3)
print(np.array_equal(x, y)) # True,说明同种子可复现
这段代码的意义不在于记住 API,而在于建立习惯:每个仿真任务应拥有独立的生成器对象,种子作为实验配置的一部分被记录。当种子、生成器算法、调用顺序三者都固定时,随机数序列才真正可复现。调用顺序尤其容易被忽视——在仿真循环中提前多抽一个随机数,后续所有样本都会整体错位。
质量评估的基本判断依据
评估均匀序列时,最直接的是看一阶统计量:样本均值应接近 0.5,样本方差应接近 1/12≈0.0833。但仅看均值和方差远远不够,因为存在明显周期性的序列也可能通过这两项。更完整的做法包括:把 [0,1) 等分为 k 个区间做卡方拟合优度检验;用 Kolmogorov–Smirnov 检验比较经验分布与均匀分布;计算滞后 1 至若干阶的自相关系数,观察是否显著偏离 0。对于分布变换后的样本,则应针对目标分布重复拟合优度检验,例如指数分布可用 KS 检验,离散分布可用卡方检验。
实战项目与学习目标
本课程的实战项目是一个单服务台排队系统(M/M/1)的仿真复现。项目要求你完成四件事:用固定种子生成到达间隔与服务时间样本;统计平均等待时间与队列长度;更换种子重复多次,给出结果的置信区间;最后验证在相同种子与相同调用顺序下,两次运行的输出逐位一致。这个项目规模不大,却完整覆盖了种子管理、分布变换、统计检验与复现验证四个关键环节。
学习路径上,课程先讲随机数发生器的原理与种子语义,再进入均匀性检验与相关性分析,随后讲解逆变换法、拒绝采样等分布生成技术,最后落到并行随机流划分与复现工程实践。建议你在学习过程中始终保留一份“实验记录”:记录种子、生成器类型、样本量、检验方法与结论。这份记录本身就是可复现性的一部分,也是后续排障时最有价值的依据。
概览到此,你已经建立了三个基本认识:随机数是仿真复现的地基;质量评估要覆盖可复现性、均匀性、分布正确性与工程可用性四个维度;学习过程应围绕“固定种子—检验序列—变换分布—验证复现”这条主线展开。接下来的章节将逐段拆解这条主线中的每一个技术环节。