圆周率π是一个无理数,没有任何一个精确公式能够计算π值, π的计算只能采用近似算法。
国际公认的PI值计算采用蒙特卡洛方法。
蒙特卡洛(Monte Carlo)方法,又称随机抽样或统计试验方法。
当所求解问题是某种事件出现的概率,或某随机变量期望值时,可以通过某种“试验”的方法求解。
即:蒙特卡洛是利用随机试验求解问题的方法。
蒙特卡洛方法
蒙特卡洛方法提供了一个利用计算机中随机数和随机试验解决现实中无法通过公式求解问题的思路。
它广泛应用于金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力
学计算)等领域中。
蒙特卡洛方法求解π的步骤:
首先构造一个单位正方形和1/4圆
随机向单位正方形和圆结构抛洒大量点,对于每个点,可能在圆内或者圆外,当随机抛点数量达
到一定程度,圆内点将构成圆的面积,全部抛点将构成矩形面积。圆内点数除以圆外点数就是面积之
比,即π/4。随机点数量越大,得到的π值越精确。
π计算问题的IPO表示如下:
输入:抛点的数量
处理:对于每个抛洒点,计算点到圆心的距离,通过距离判断该点在圆内或是圆外。
统计在圆内点的数量
输出:π值
1 #pi.py 2 from random import random 3 from math import sqrt 4 from time import clock 5 DARTS = 1200 6 hits = 0 7 clock() 8 ###核心代码 9 for i in range(1, DARTS): 10 x, y = random(), random() #random() 给出随机的坐标值(x,y) 11 dist = sqrt(x**2 + y**2) #sqrt() 计算抛点到原点距离 12 if dist <= 1.0: #判断是否落在圆内 13 hits = hits + 1 14 pi = 4 * (hits/DARTS) 15 ### 16 print("pi的值是 %s" % pi) 17 print("程序运行时间是 %-5.5ss" % clock())
结果:
由于DARTS点数量较少,π的值不是很精确。