首页 > 代码库 > 蒙特卡罗(monteCarlo)

蒙特卡罗(monteCarlo)

    蒙特卡罗(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


本文出自 “abe” 博客,转载请与作者联系!

蒙特卡罗(monteCarlo)