蒙特卡洛方法与 π

蒙特卡洛方法用随机实验而不是公式来回答问题。它的第一个经典例子,就是向正方形中的圆投飞镖来估算 π。

正方形中的随机飞镖:圆内为蓝色,圆外为红色,旁边是 π 的估计值和显示其收敛过程的图表
正方形中的随机飞镖:圆内为蓝色,圆外为红色,旁边是 π 的估计值和显示其收敛过程的图表

把面积看作概率

在正方形里随机取一个点,每个位置的可能性都相同。它落在某个区域的概率,等于这个区域的面积除以正方形的面积。半径为 1 的圆面积为 π,外面的正方形边长为 2,面积为 4。所以随机点落在圆内的概率是 P = π/4 ≈ 0.785。

从命中数到 π

投出 N 支飞镖,数出落在圆内的命中数 H。比例 H/N 是 π/4 的估计,所以

π ≈ 4H / N

判断是否命中根本不需要 π:以圆心为原点、以半径为单位测量的点 (x, y),当 x² + y² ≤ 1 时就在圆内。π 是从计数中得出来的。

四分之一圆版本把圆心放在边长为 1 的正方形的一个角上。四分之一圆同样占这个正方形面积的 π/4,所以公式不变。

大数定律

每支飞镖都是一个只有两种结果的小实验:以概率 p = π/4 命中,或者未命中。大数定律由雅各布·伯努利证明,于 1713 年发表。它说明随着 N 增大,命中比例可以任意接近 p。它并不是说命中和未命中会在短期内相互抵消:估计值可能会长时间偏离 π,然后才回来。

收敛有多快?

命中数服从二项分布。把它的标准差换算到 π 的尺度上,就得到典型误差

σ ≈ 4 · √(p(1 − p) / N) ≈ 1.64 / √N

投 100 支后约为 0.16,投 1 万支后约为 0.016,投 100 万支后约为 0.0016。误差随 N 的平方根缩小:飞镖增加到一百倍,才能多得一位正确数字。在应用中,阴影带是 ±1.96σ,包含所有模拟的 95%;估计值后面的 ± 是一个标准误差。

名字的由来

1946 年,正在养病的斯坦尼斯拉夫·乌拉姆想知道玩一局单人纸牌获胜的可能性有多大。他没有去数所有可能的发牌方式,而是想到干脆玩很多局,再数赢了多少局。他和约翰·冯·诺依曼把这个想法变成了洛斯阿拉莫斯中子计算的一种方法,他们的同事尼古拉斯·梅特罗波利斯以蒙特卡洛赌场为它命名——乌拉姆的叔叔很喜欢在那里赌博。更早的随机实验,比如 1777 年的布丰投针,早已以同样的思路估算过 π。

在 PictorX 中探索

打开蒙特卡洛求 π,飞镖已经在飞了,每秒一千支。计数器会给已经与 π 相符的数字上色,图表在对数坐标轴上显示估计值,以及 95% 的模拟最终所在的带状区域。“慢动作”每秒投一支飞镖,并画出它到圆心的距离;点击正方形可以自己投一支。“一百万支飞镖”一次投出全部飞镖。“四分之一圆”切换到角落版本,“淡化旧飞镖”让画面在高速时依然清晰生动。保存为 PNG,或者与布丰投针比较一下,它用落下的针来估算 π。

常见问题

谁发明了蒙特卡洛方法?

斯坦尼斯拉夫·乌拉姆和约翰·冯·诺依曼于 20 世纪 40 年代后期在洛斯阿拉莫斯提出了这种方法,尼古拉斯·梅特罗波利斯为它命名。用随机实验估算数值的做法更早,例如 1777 年的布丰投针。

为什么概率是 π/4?

半径为 1 的圆面积为 π,外面的正方形面积为 4。一个落在正方形内任何位置的可能性都相同的点,落在圆内的概率就是 π/4。

估计有多准确?

对 N 支飞镖来说,一个标准误差约为 1.64/√N。一千支飞镖的误差通常约为 0.05,一百万支飞镖约为 0.0016。

蒙特卡洛方法是计算 π 的好办法吗?

不是。人们已经用公式算出了 π 的数万亿位;随机飞镖却连六位都很难得到。这种方法的长处在于没有公式可用的地方,比如中子的路径、投资的风险,或光线在场景中的反弹。

估计值会恰好等于 π 吗?

不会。投 N 支飞镖后,估计值是分数 4H/N,而 π 是无理数,所以它永远不可能完全准确。它只会以越来越高的概率越来越接近。

准备好尝试了吗?

在浏览器中打开 PictorX — 无需安装,无需信用卡即可启动。

试试蒙特卡洛求 π