1.问题描述
使用蒙特卡罗法求π的近似值。
蒙特卡罗方法或称计算机模拟方法,是一种基于“随机数”的计算
法。这一方法源于美国在第二次世界大战时研制原子弹的“曼哈顿计划”。
该计划的主持人之一数学家冯·诺依曼用驰名世界的赌城——摩纳哥的蒙
特卡罗来命名这种方法,为它蒙上了一层神秘的色彩。
蒙特卡罗方法的思路是,在一个单位边长的正方形中,以边长为半
径,以一个顶点为圆心,在这个正方形上作四分之一圆。在正方形中随机
地投入很多点,使所投入的点落在正方形中每一个位置的机会相等。若点
落入四分之一圆内则计数。重复地向正方形中投入足够多的点,用落入四
分之一圆内的点数除以总的点数,得到的就是π的四分之一的近似值。
2.问题分析
使用随机函数random()随机产生两个小数x、y构成一个坐标点(x,y),
假设正方形的边长为100,则判断坐标点是否落在四分之一圆内的条件是
x2+y2≤10000,其中0≤x≤100,0≤y≤100。若总共向正方形中投放了N个
点,而落在四分之一圆内部的点为d个,则π=4*d/N。
需要注意的是,蒙特卡罗方法是使用随机模拟实验结果进行统计来求
π的近似值的方法。因此使用该方法所求出的π值只有当统计次数足够多时
才会准确,在统计次数较少时会存在一定的误差。
3.算法设计
我们使用Python的random模块中的函数来生成随机数。关于random模
块的相关方法,在第4章已经介绍过了,此处不再陈述。在本程序中,我
们使用random模块的random()函数来生成两个小数,构成一个点的坐标,
代码如下:

# 随机生成[0, 1)之间的数
x, y = random(), random()

然后利用Python的math模块的sqrt()函数来判断这个点是否落在圆内,
代码如下:

# 蒙特卡罗法求解
dist = math.sqrt(x**2+y**2)
if dist <= 1.0:
hits = hits+1

4.确定程序框架
程序的流程图如图10.11所示。

 5.完整的程序
根据上面的分析,编写完整的程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: π的近似值 ——蒙特卡罗法求解
from random import random
import math
if __name__ == "__main__":
DARTS = 300000000 # 落入正方形的总的点数,此数越大,越逼近π的近似值
hits = 0.0 # 落入四分之一圆的点数
for i in range(1, DARTS+1):
x, y = random(), random() # 随机生成[0, 1)之间的数
dist = math.sqrt(x**2+y**2) # 蒙特卡罗法求解
if dist <= 1.0:
hits = hits+1
pi = 4*(hits/DARTS) # 计算π的近似值
print("pi的值{}.".format(pi))

6.运行结果
在PyCharm下运行程序,共运行了3次,第一次得到的π值为
3.14162572,第二次得到的π值为3.141629573,第三次得到的π值为
3.1414737466,显示结果如图10.12所示。根据显示结果可知,由于蒙特卡
罗法是采用统计规律来计算π值,因此求出的是π的近似值,仅当统计次数
足够大时,才会更接近π值

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐