蒙特卡罗(Monte Carlo)是世界著名的赌城,是摩纳哥的标志,与拉斯×××、澳门号称世界三大赌城。但是这里我们要讲到的蒙特卡罗并不是,而是一种统计方法。其原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。它诞生于上个世纪40年代美国的"曼哈顿计划",名字来源于赌城蒙特卡罗,象征概率。
通过蒙特卡罗的概率计算,可以解决许多数学问题及业务问题,其最经典的案例即求解圆周率π。在一个正方形内画出一个跟四边正切的圆,设圆的半径r=1,则可知圆的面积为π·r·r,此时正方形的面积则为2r·2r,如下图:
将圆面积同正方形面积进行对比,可得:π·r·r / 2r·2r = π / 4,由此可知当在正方形中随机生成一个点,它落入圆内的概率为π / 4。假设随机生成100个点,其中94个落入圆中,则可得π = 4 * 94 / 100(随机生成的点越多,π越逼近真实值)。
使用蒙特卡罗求解π:
# --*-- coding: utf-8 --*--
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
def monteCarlo(n):
o, r = (0., 0.), 1.0 #设置圆心及半径
a, b = (o[0] - r , o[0] + r), (o[1] - r , o[1] + r) #设置正方形边长范围
#在正方形内投点
x = np.random.uniform(a[0], a[1], n)
y = np.random.uniform(b[0], b[1], n)
#获取落入圆内点的数目
dist = np.sqrt((x - o[0]) ** 2 + (y - o[1]) ** 2)
goal_dots = len([i for i in dist if i < r])
pi = 4 * float(goal_dots) / n
print '值为:', pi
#图示化
fig = plt.figure()
axes = fig.add_subplot(111)
axes.plot(x, y, 'o', markersize = 1)
plt.axis('equal')
circle = Circle(o, r, alpha = 0.5)
axes.add_patch(circle)
plt.show()
if __name__ == '__main__':
monteCarlo(10000)
随机生成10000个点得到图示化效果及π如下:
值为: 3.1416
来源:oschina
链接:https://my.oschina.net/u/4393623/blog/4293432