今天是 3 月 14 日,π 日。突然想尝试用 Python 来模拟布冯投针实验来计算 π。
原理
实验设定
- 假设有一组平行线,线间距为 \(d\)。
- 将一根长度为 \(l\) 的针(通常 \(l \leq d\))随机投掷到平面上。
- 针的中点到最近线的距离 \(x\) 在 \([0, d/2]\) 均匀分布。
- 针与水平线的夹角 \(\theta\) 在 \([0, \pi/2]\) 均匀分布。
相交条件
- 针与某条平行线相交的条件是:针的中点到最近线的距离 \(x\) 小于等于针的投影长度,即 \(x \leq (l/2) \cdot \sin(\theta)\)。
- 这意味着针的一端跨过了某条线。
概率计算
- 通过几何概率分析,针与线相交的概率 \(P\) 可以推导出为:
\[P = \frac{2l}{\pi d}\]
核心思想
- 在实验中,通过大量投针,统计针与线相交的次数 \(N_{\text{cross}}\) 和总投针次数 \(N_{\text{total}}\),计算相交概率的实验值:
\[P_{\text{exp}} = \frac{N_{\text{cross}}}{N_{\text{total}}}\] - 根据理论公式 \(P = \frac{2l}{\pi d}\),可以反推出 π 的估计值:
\[\pi \approx \frac{2l}{P_{\text{exp}} \cdot d}\]
实现
| |
结果
投针次数: 100
针的长度: 1.0
线间距: 1.5
估计的 π 值: 3.1746031746031744
实际的 π 值: 3.141592653589793
误差: 0.03301052101338131投针次数: 1000
针的长度: 1.0
线间距: 1.5
估计的 π 值: 3.134796238244514
实际的 π 值: 3.141592653589793
误差: 0.006796415345279083投针次数: 10000
针的长度: 1.0
线间距: 1.5
估计的 π 值: 3.14911037631869
实际的 π 值: 3.141592653589793
误差: 0.007517722728896725

