布丰投针模拟器 返回
概率与蒙特卡罗

布丰投针模拟器 — 用概率估算圆周率π

在等间距平行线的地板上随机投针的古典实验。从相交概率估算圆周率π。改变针的根数、长度、线间距与随机数 seed,体验概率与几何的奇妙联系。

参数设置
针的根数 N
针的长度 ℓ
mm
线间距 d
mm
随机数 seed
针的长度 ℓ 超过了线间距 d。布丰公式仅在 ℓ ≤ d 时成立。请调整 ℓ 或 d。

随机数采用确定性的线性同余法(LCG)生成,相同 seed 下结果完全可复现。

计算结果
相交数 m
估计概率 m/N
估计 π
相对误差
平行线地板与落下的针

红色=与线相交的针/蓝色=未相交的针(最多显示 200 根作为样本;统计使用全部 N 次投掷)

理论与主要公式

平行线间距 $d$,针的长度 $\ell$($\ell \le d$)。设针中心到最近线的距离为 $y$,针与线的夹角为 $\theta$,二者为独立均匀分布。相交条件为:

$$y \le \tfrac{\ell}{2} \sin\theta$$

对相交概率积分得:

$$P = \frac{2\ell}{\pi d}$$

投掷 $N$ 根针中有 $m$ 根相交时,$m/N \approx P$,因此 π 的估计为:

$$\hat\pi = \frac{2\,\ell\,N}{d\,m}$$

由大数定律,$N \to \infty$ 时 $\hat\pi \to \pi$,误差按 $1/\sqrt{N}$ 减小。

布丰投针模拟器是什么

🙋
投针就能算出 π?听起来像变魔术一样。
🎓
大致来说,这是 18 世纪数学家布丰提出的古典实验。在地板上画出等间距的平行线,把长度 ℓ 的针真正随机地扔下来。针与线相交的概率竟然是 $P = 2\ell/(\pi d)$——π 出现在分母上。所以投 N 根针中有 m 根相交时,可以反推 $\pi \approx 2\ell N/(d m)$。上面点一下「重新投掷」,默认的 5000 根针通常会落到 3.14 附近。
🙋
为什么把位置和角度都随机化,π 就会冒出来?
🎓
关键在这里:当针的角度 $\theta$ 均匀分布时,针的竖直投影是 $(\ell/2)\sin\theta$。把中心位置 $y$ 与角度都看作独立的均匀随机变量,对相交条件 $y \le (\ell/2)\sin\theta$ 做积分,会出现 $\sin\theta$ 在四分之一圆周上的积分(恰好等于 2)。再除以归一化的范围 $\pi/2$ 与 $d/2$ 之后,π 自然就锁在分母上。这是概率与几何相遇时非常漂亮的现象。
🙋
N 越大精度就越好吗?为什么 seed 一变结果就跟着变?
🎓
精度会变好,但提升得很慢。蒙特卡罗法的标准误差与 $1/\sqrt{N}$ 成正比,所以精度提高 10 倍要把样本量增加 100 倍。本工具采用「确定性线性同余法(LCG)」生成随机数,相同 seed 给出完全一致的结果。换 seed 等于换了一段「投针故事」,同样的 N 下 m 也会有所变化——这就是所谓的「抽样波动」。实务中需要可复现结果时,固定 seed 也是铁律。
🙋
把 ℓ 调大它弹出警告说不行,为什么?
🎓
好问题。当 $\ell \le d$ 时,每根针最多只能与一条线相交,所以直接数相交数就能套上 $P = 2\ell/(\pi d)$。但一旦 $\ell > d$,针可能同时跨过两条以上的平行线,正确公式会变成「广义布丰公式」,含有 $\arccos$ 与额外的积分,复杂度跳了一大截。出于教学清晰度,本工具把范围限制在 $\ell \le d$,超出时显示警告并停止计算,避免给出误导性的估计。

常见问题

相对误差近似按 $1/\sqrt{N}$ 缩小。N=5,000 时误差通常在百分之几以内,N=100,000 时一般能压到 0.5% 左右。由于单次实验也存在抽样波动,建议改变 seed 多次运行,确认估计值是否稳定,这才是实务做法。
相交概率 $P = 2\ell/(\pi d)$,比值 ℓ/d 越大,相交的针越多。例如 ℓ=d 时 P ≈ 0.637,ℓ=d/2 时 P ≈ 0.318。相交数 m 越大,π 的估计越稳定,因此教学上常把 ℓ 取得接近 d。本工具默认 ℓ=5、d=10,对应 P ≈ 1/π ≈ 0.318。
几乎不可能。m 是整数,$\hat\pi = 2\ell N/(d m)$ 只取离散值,无法恰好等于无理数 π。但随着 N 增大,可能取到的值间距变小,分布会越来越集中在 π 附近——这就是这里所说的「收敛」。
有影响。本工具出于教学考虑使用线性同余法(LCG),对几千到几万次投掷足够。但当真正做百万级的蒙特卡罗时,LCG 的短周期与结构性偏差可能引入系统误差,应改用梅森旋转算法或 PCG 等现代伪随机数算法。LCG 在相同 seed 下完全可复现,这一点在教学和验证场景反而是优点。

实际应用

蒙特卡罗法最古典的入门示例:布丰投针是用概率求确定性常数(π)的最早例子之一,至今仍然是讲解蒙特卡罗法时的标准入口。「用随机抽样估计困难的积分或常数」这一蒙特卡罗核心思想,通过投针这件事就能直观体会到。

CAE 中的概率分析:当有限元分析(FEA)结合材料强度或尺寸的随机性进行可靠性分析(MC-FEA)时,底层逻辑与布丰相同——随机抽样后再做概率估计。桥梁与航空结构的破坏概率,常需要数千到上百万次随机化的 FEA 来评估。

金融工程与风险评估:期权定价的蒙特卡罗法、投资组合 VaR(在险价值)估算等,都依赖随机抽样估计未知量。在布丰投针实验中观察到的「样本数与误差的关系」,可以直接用于规划 VaR 计算所需的模拟次数。

渲染(光线追踪):3DCG 的真实感渲染中,每个像素都要通过随机抽样光路来积分计算光强。增加每像素采样数后噪声减小、画面变平滑,本质上与投针越多 π 的估计越稳定是完全相同的现象。

常见误解与注意事项

最常见的误解是「样本数越多就一定单调地接近 π」。实际上,估计值会一边波动一边接近,途中暂时远离 π 也很正常。可以把 seed 依次改成 1、2、3……,会发现同样的 N=5,000 下结果会有几个百分点的差异。不要寄希望于「一次实验就中」,要看多次独立实验的分布——这才是蒙特卡罗的正确用法。

其次是「针越长精度越高」这种想当然。确实,把 ℓ 调大会让相交概率提升、相交数 m 增加,从而让单次计算更稳定。但一旦 $\ell > d$,布丰简单公式 $P = 2\ell/(\pi d)$ 就不再成立,必须改用考虑多线相交的广义公式。本工具在 $\ell > d$ 时直接报警停算,但网络上的某些教程会简单地说「把针调长就好」,要警惕这种说法。

最后一种是固定 seed 后单纯增加 N 来「研究采样波动」。确定性随机数下,增加 N 只是延续了同一段随机序列,单次实验内的独立性是有的,但从外部看仍然只是一条样本路径。要严肃地研究统计波动,正确的做法是用不同 seed(1, 2, …, M)跑 M 次独立实验,取其均值与标准差。本工具的 seed 滑块正是为了让你方便地体验「换一次独立实验」这件事。