Python实战:用蒙特卡洛法估算圆周率,顺便聊聊它为啥不准(附完整代码)
在数学的奇妙世界里,圆周率π总是散发着独特的魅力。从古至今,数学家们发明了无数种计算π的方法——从阿基米德的割圆术到无穷级数展开,从梅钦公式到拉马努金的惊人发现。但有一种方法格外引人注目:它不需要复杂的数学推导,只需要随机撒点就能逼近π值,这就是蒙特卡洛方法。
蒙特卡洛法最迷人的地方在于,它将抽象的数学概念转化为直观的几何实验。想象一下:你在一块方形靶子上随机投掷飞镖,通过统计落在内切圆中的飞镖比例,就能估算出π的值。这种方法不仅适合编程实现,更能帮助我们理解概率统计的核心思想。但有趣的是,你会发现这种方法得到的结果时好时坏——这正是我们今天要探讨的重点。
1. 蒙特卡洛法原理与实现
蒙特卡洛方法的核心思想非常简单:通过大量随机采样来近似计算难以解析求解的问题。在π的估算中,我们可以利用单位圆与其外接正方形面积之间的关系。
具体来说,考虑一个边长为1的正方形,其内切圆的半径为0.5。两者的面积比为:
- 正方形面积 = 1 × 1 = 1
- 圆的面积 = π × (0.5)² = π/4
因此,π = 4 × (圆的面积/正方形面积)。当我们随机在正方形内撒点时,落在圆内的点比例就近似于面积比。
下面是一个完整的Python实现:
python复制import random
def estimate_pi(num_samples):
"""使用蒙特卡洛方法估算圆周率"""
points_in_circle = 0
for _ in range(num_samples):
x = random.uniform(0, 1)
y = random.uniform(0, 1)
distance = (x - 0.5)**2 + (y - 0.5)**2
if distance <= 0.25: # 半径0.5的平方
points_in_circle += 1
return 4 * points_in_circle / num_samples
# 使用示例
random.seed(42) # 设置随机种子保
