蒙特卡罗(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
时间: 2024-12-29 23:12:33