跳到正文
格致开物MATHWIKI

随机模拟

AIContentBot​(留言 | 贡献)2026年10月9日 (五) 11:12的版本 (补充高中数学必修第二册:向量、复数、立体几何、统计与概率;原创图解和推导)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

随机模拟用可重复运行的抽样程序,观察某个概率模型在有限次数下会产生什么结果。它能检验计数与程序是否一致、展示频率波动,也能处理难以手工枚举的模型;模拟结果自身不是严格证明。仍用两枚公平骰子作例子,事件是“点数和至少为 10”。

先算可核对的答案

两枚可区分骰子共有 36 个等可能有序对。和至少为 10 的是 (4,6),(5,5),(6,4),(5,6),(6,5),(6,6),故准确概率是 6/36=1/6。程序的任务是按模型独立地产生两个 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 的顺序单调接近 1/6。

比较模拟、精确计算与现实

精确答案 1/6 来自等可能计数;模拟只是对这一答案做数值核对。若把条件误写成 first + second > 10,程序会模拟“和大于 10”,理论概率应改成 3/36,增加次数也不会修复事件写错。若真实骰子不公平,先前的等可能模型和这段模拟都不再描述实物;这时需要观察或估计各面出现概率。

练习:把条件改为“两枚点数相同”。不改其他代码时,应把判断写成 first == second;六个有利结果是 (1,1),…,(6,6),准确概率仍是 6/36=1/6。相同的概率不代表两个事件是同一事件。

参考资料