蒙特卡洛法近似π:539354个点精度超预期,求排查
蒙特卡洛法估算π的精度问题分析
代码正确性验证
你的Python代码逻辑完全正确:
- 核心逻辑通过生成
[0,1)范围内的随机点,统计落入单位四分之一圆内的点数占比,再乘以4得到π的近似值,完全符合蒙特卡洛法的原理。 simulX函数未被调用,不影响最终计算结果。- 1000次测试取平均偏差的计算方式合理,能准确反映近似值的整体误差水平。
精度与样本量的关系
你之前对所需点数的估计有误,根源是对蒙特卡洛法的误差特性理解偏差:蒙特卡洛法的误差阶数是O(1/√n)(而非O(1/n)),具体推导如下:
- 设单次试验中点落入四分之一圆的概率为( p = \pi/4 ),则统计落入圆内的点数( S_n )服从二项分布( B(n, p) ),其方差为( Var(S_n) = n p (1-p) )。
- π的近似值( P_n = 4 S_n / n ),其方差为:
[
Var(P_n) = 16 \cdot \frac{Var(S_n)}{n^2} = \frac{16 p (1-p)}{n} = \frac{\pi(4-\pi)}{n} \approx \frac{2.7}{n}
] - 标准差( \sigma = \sqrt{Var(P_n)} \approx \sqrt{\frac{2.7}{n}} )。若要标准差小于( 10^{-2} ),代入计算得:
[
\sqrt{\frac{2.7}{n}} < 0.01 \implies n > \frac{2.7}{0.0001} = 27000
]
仅需27000个点就能达到( 10^{-2} )级别的精度,你使用的539354个点远大于这个数值,因此平均偏差远小于( 10^{-2} )是完全正常的。
总结
- 代码无错误,计算逻辑正确。
- 达到百分之一精度所需的点数远少于你之前的估计,这是由蒙特卡洛法“误差与样本量的平方根成反比”的特性决定的。
内容的提问来源于stack exchange,提问作者Lapin
相关产品推荐
相关产品推荐

