布丰针实验模拟器 返回
概率·蒙特卡罗

布丰针实验模拟器 — 用概率估计π

在等间距平行线的床面上随机投掷针,通过线的交叉概率来估计圆周率π。改变针数、针长度和线间隔,体验概率与几何的神奇联系。

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

随机数由确定性线性同余法(LCG)生成,相同的seed将产生完全相同的结果。

暂停时,拖动滑块即可即时更新结果。

计算结果
投掷数 N
交叉数 H
π 估计值
与真值π的误差
落针动画(实时)

针逐根落下的实时动画。红色=与线相交的针 / 蓝色=未相交的针。随着 N 增加,π 估计值收敛于 3.14159。

理论和主要公式

平行线间隔 $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世纪数学家布丰设计的经典实验。在床面上以间隔 d 画出平行线,然后把长度为 ℓ 的针随机投掷下去。针与线相交的概率是 $P = 2\ell/(\pi d)$。π出现在分母中!投掷 N 根针,其中 m 根相交,就可以用 $\pi \approx 2\ell N / (d m)$ 反推出π。在上面的模拟器中,用默认的5000根针试试看。你会得到接近3.14的值。
🙋
为什么随机的角度和位置会产生π?
🎓
这是最妙的地方。当你随机选择针的角度 θ 时,针在竖直方向的投影是 $(\ell/2)\sin\theta$。将中心位置 $y$ 和角度 $\theta$ 作为独立的均匀随机数,对交叉条件 $y \le (\ell/2)\sin\theta$ 求概率的积分。在这个过程中,$\sin\theta$ 在 $[0, \pi/2]$ 上的积分(值为2)会出现,π就自然地进入了分母。这是概率和几何的一个优美交汇点。
🙋
增加针的数量精度会一直提高吗?改变seed会改变结果吗?为什么?
🎓
精度会提高,但速度很缓慢。蒙特卡罗方法的标准误差与 $1/\sqrt{N}$ 成正比,所以要使精度提高10倍,就得把针数增加100倍。这工具用的是"确定性线性同余法(LCG)"来生成随机数,所以相同的seed会给出完全相同的结果。改变seed就会得到另一套"投掷故事",相同的N下m会略有不同。这就是"抽样波动"。
🙋
出现"ℓ 大于 d"的警告。这是怎么回事?
🎓
好问题。公式 $P = 2\ell/(\pi d)$ 只在 $\ell \le d$ 时成立。此时针最多与1条线相交。但当 $\ell > d$ 时,针可能同时跨越2条或更多平行线。这时概率公式变成"广义布丰公式",会涉及反三角函数和更复杂的积分。为了教学清晰,我们在 $\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≈0.318(=1/π)。
不能精确一致。因为m是整数,$\hat\pi = 2\ell N/(d m)$ 只能取离散值,无法等于无理数π。但当N增加时,可取值的间隔变小,π可以任意近似。这就是"依分布收敛"的含义。
有影响。本工具为教学目的使用线性同余法(LCG),在数千到十万次试验中工作良好。但对于数百万次以上的严肃蒙特卡罗,LCG的短周期和偏差可能引入偏误,应该用梅森旋转或PCG等现代算法。相同seed完全再现结果的特性对教学和验证很有帮助。

实际应用

蒙特卡罗法的最古典入门:布丰针是利用概率求解确定常数(如π)的最早例子,也是学习蒙特卡罗方法时的常用入口。仅通过投掷针这一简单操作,就能体会蒙特卡罗法的核心思想:"随机抽样来估计困难的积分和常数"。

CAE中的可靠性分析:在有限元分析(FEM)中进行信可度分析时(MC-FEM),根本思想就是"随机抽样→概率估计",与布丰实验如出一辙。针对桥梁或飞机结构的失效概率,通过改变输入参数进行数千到数万次FEM计算来评估。

金融工程·风险评估:期权定价的蒙特卡罗评估和投资组合的风险价值(VaR)计算中都广泛应用随机抽样。布丰针中学到的"抽样数N与误差关系"直接适用于VaR计算的收敛评估。

计算机图形学(光线追踪):逼真渲染中,每个像素用随机抽样的光线路径来计算光强。这本质上与布丰针相同(用随机的线来测量某个量),增加样本数降低噪声的过程完全对应π估计随N增加而趋稳的现象。

常见误区和注意

最普遍的误区是期待"针数越多就单调接近π"。实际上估计值会上下波动,逐渐靠近π。试试把seed改成1、2、3...,用相同的N=5000会看到几个百分点的波动。蒙特卡罗的正确用法是多次实验,观察分布,而不是期待一次命中。

其次是认为"针越长精度越高"。长针确实增加交叉数m,稳定性好,但 ℓ > d 就违反了简单公式 $P = 2\ell/(\pi d)$,需要更复杂的广义公式。本工具在 ℓ > d 时警告并停止,教科书若说"随意加长针"要特别注意。

最后是用同一seed增加N来"提升精度"的错误。确定性随机数下,相同seed只是继续原来的序列,不能产生新的独立样本。正确方法是用不同seed各做一次实验,然后取多次结果的平均值和标准差来评价。这也是本工具seed滑块的设计初衷。

使用指南

  1. 设置针数 N(推荐100~10000根)。针数越多,π估计精度越高
  2. 确定针长 L [mm] 和线间隔 D [mm] 的比例。L/D=0.5是标准设置
  3. 输入随机数种子启动实验。模拟器投掷 N 根针,统计与平行线的交叉数 m
  4. 从理论交叉概率 P=2L/(πD) 反推 π≈2NL/(mD),显示相对误差

具体计算示例

针数 N=5000根、针长 L=5mm、线间隔 D=10mm(默认值,L/D=0.5)、seed=42 时:理论交叉概率为 P=2×5/(π×10)≈0.3183。本工具的确定性LCG下 m=1542根相交,估计概率为1542/5000=0.3084,π≈2×5×5000/(10×1542)=3.2425,与真值的相对误差约3.21%。改变种子值得到不同试验结果,多次实验可观察估计值的分布

实务注意事项

  1. L/D 比过大时(如 L/D>1)多重交叉判定复杂。应在 L/D≤0.8范围内运行
  2. N<500时统计波动大,π估计值在3.0~3.3范围变动。精密值需要 N≥5000
  3. 为避免工业随机数生成的周期性影响,用不同种子多次实验取平均值
  4. 浮点误差会累积,整数交叉数 m 和π估计值应保留3~4位有效数字