Python教学书籍和视频中经常出现Python蒙特卡洛法计算圆周率,原理就是随机向正方形中投掷一定数量的点。落在正方形内扇形中的点的数量与总点数的比值即Π/4,进而求出Π的近似值。如下图:
pi2.png最近在学NumPy时突然想到是否可以用NumPy来计算圆周率近似值,于是在网上搜索一番,只找到一篇关于NumPy计算圆周率的文章。点进去居然不能看,需要办VIP才能看。我瞬间被某网站敝帚自珍的精神感动到,于是决定自己写一篇可以免费看的。下面是代码:
import numpy as np
import time
start = time.perf_counter()
# 投掷点数总和
DART = 2**27
# 落在圆内的点数
hits = 0
# 使用numpy的随机函数生成2行DART列的矩阵: points, 代表投掷DART次点的坐标,
# 第0行代表x轴坐标,第1行代表y轴坐标。
points = np.random.rand(2, DART)
# 对矩阵计算,代替循环。
hits = np.sum(np.where(((points[0]**2 + points[1]**2)**0.5) < 1, 1, 0))
# 求得pi的值
pi = 4 * hits / DART
end = time.perf_counter()
# 求得计算所用的时间
ttime = end - start
print("PI is: {}".format(pi))
print("Total time is: {:.5f}s".format(ttime))
网友评论