随机模拟
随机模拟用可重复运行的抽样程序,观察某个概率模型在有限次数下会产生什么结果。它能检验计数与程序是否一致、展示频率波动,也能处理难以手工枚举的模型;模拟结果自身不是严格证明。仍用两枚公平骰子作例子,事件是“点数和至少为 10”。
先算可核对的答案
两枚可区分骰子共有 36 个等可能有序对。和至少为 10 的是 ,故准确概率是 。程序的任务是按模型独立地产生两个 1 至 6 的整数,记录满足条件的次数,并让读者比较不同试验量下的频率。
Python 3
import random
rng = random.Random(20261009)
hits = 0
checkpoints = {100, 1_000, 10_000}
for trial in range(1, 10_001):
first = rng.randint(1, 6)
second = rng.randint(1, 6)
if first + second >= 10:
hits += 1
if trial in checkpoints:
print(trial, hits, hits / trial)
print("exact probability:", 6 / 36)
代码中 rng 是固定种子的伪随机数生成器,方便复现同一组结果;改变种子通常会得到另一条频率路径。randint(1, 6) 为每枚骰子分别生成 1 至 6 的整数,恰好对应 36 个有序对的理想模型。循环变量 trial 记录已模拟的次数,hits 只在两枚点数和至少为 10 时加一。输出的三行频率可以上下波动,未必按 100、1000、10000 的顺序单调接近 。
比较模拟、精确计算与现实
精确答案 来自等可能计数;模拟只是对这一答案做数值核对。若把条件误写成 first + second > 10,程序会模拟“和大于 10”,理论概率应改成 ,增加次数也不会修复事件写错。若真实骰子不公平,先前的等可能模型和这段模拟都不再描述实物;这时需要观察或估计各面出现概率。
练习:把条件改为“两枚点数相同”。不改其他代码时,应把判断写成 first == second;六个有利结果是 ,准确概率仍是 。相同的概率不代表两个事件是同一事件。
参考资料
- Python 标准库:random:伪随机数、固定种子与整数抽样。
- 继续阅读:频率与概率、概率、大数定律。