python求圆周率的值,在Python语言中利用蒙特卡洛算法求圆周率
python求圆周率的值,在Python语言中利用蒙特卡洛算法求圆周率在这个正方形内部,随机产生n个点(这些点服从均匀分布),计算它们与中心点的距离是否大于圆的半径,以此判断是否落在圆的内部。统计圆内的点数,与n的比值乘以4,就是π的值。理论上,n越大,计算的π值越准。一个正方形内部相切一个圆,圆和正方形的面积之比是π/4。以概率和统计理论方法为基础的一种计算方法。将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解。比如,给定x=a,和x=b,你要求某一曲线f和这两竖线,及x轴围成的面积,你可以起定y轴一横线 y=c 其中c>=f(a) and c>=f(b),很简单的,你可以求出 y=c x=a x=b 及 x轴围成的矩形面积,然后利用随机参生生大量在这个矩形范围之类的点,统计出现在曲线上部点数和出现在曲线下部点的数目,记为:doteUpCount nodeDownCount 然后所要求的面积可以近似为 dot
背景知识:蒙特卡洛是摩纳哥公国第一大城市,与澳门、美国拉斯维加斯并称世界三大赌城。位于地中海沿岸,首都摩纳哥之北,建于阿尔卑斯山脉突出地中海的悬崖之上。景色优美,是地中海地区的旅游胜地。市内建有豪华的旅馆、俱乐部、歌剧院、商店、游泳池、温泉浴室、运动场等娱乐设施 。城内开设有蒙特卡洛大赌场。赌场建于 1865 年,为双层楼建筑,上有钟楼、塔厅和拱形亭阁,还饰以若干人物雕塑,庭前棕榈树成行,还辟有花园,旁边有大酒店和酒吧间。整个城市在旺季时,约有赌场 70 多个,约有赌室 3500 间左右。蒙特卡罗赌场由国家经营。当地的其他活动,许多也带有赌博色彩。游客住的旅店房间,有抽奖的号码,中奖的免付部分房费。早餐的牛奶麦片粥里,如遇上金属牌子 ,亦可领奖。该城只有 1 万人口,但每天报纸销量可达 100 万份 ,因为报纸上都印有可能得奖的号码。游客最后离境,购买的车票上也印有号码,于离境前开出。经营赌业是摩纳哥的主要经济来源,每年都从赌业中收取高额外汇利润。
蒙特卡洛方法
蒙特卡洛是一个地名,位于赌城摩纳哥,象征概率。蒙特卡洛(Monte Carlo)方法是由大名鼎鼎的数学家冯·诺伊曼提出的,诞生于上世纪40年代美国的“曼哈顿计划”。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。
蒙特卡洛算法简单描述:
以概率和统计理论方法为基础的一种计算方法。将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解。比如,给定x=a,和x=b,你要求某一曲线f和这两竖线,及x轴围成的面积,你可以起定y轴一横线 y=c 其中c>=f(a) and c>=f(b),很简单的,你可以求出 y=c x=a x=b 及 x轴围成的矩形面积,然后利用随机参生生大量在这个矩形范围之类的点,统计出现在曲线上部点数和出现在曲线下部点的数目,记为:doteUpCount nodeDownCount 然后所要求的面积可以近似为 doteDownCounts所占比例矩形面积。
问题描述:
在数值积分法中,利用求单位圆的1/4的面积来求得Pi/4从而得到Pi。单位圆的1/4面积是一个扇形,它是边长为1单位正方形的一部分。只要能求出扇形面积S1在正方形面积S中占的比例K=S1/S就立即能得到S1,从而得到Pi的值。怎样求出扇形面积在正方形面积中占的比例K呢?一个办法是在正方形中随机投入很多点,使所投的点落在正方形中每一个位置的机会相等看其中有多少个点落在扇形内。将落在扇形内的点数m与所投点的总数n的比m/n作为k的近似值。P落在扇形内的充要条件是x^2 y^2<=1。
二、计算圆周率的原理一个正方形内部相切一个圆,圆和正方形的面积之比是π/4。
在这个正方形内部,随机产生n个点(这些点服从均匀分布),计算它们与中心点的距离是否大于圆的半径,以此判断是否落在圆的内部。统计圆内的点数,与n的比值乘以4,就是π的值。理论上,n越大,计算的π值越准。
蒙特卡洛方法求解圆周率的基本思路是对一个区域撒点,点的掉落是随机的,进行多次撒点后,计算点落在所求区域内外的数量比得到所求数值的近似值。 这个方法是计算思维的一个重要体现,即抽象一种过程,用计算机自动化求解。与依靠具体公式求解的数学思维相对立。 这里选取一个半径为1的圆的1/4,同时给出一个与之相切的正方形的1/4,利用这一部分进行重复的抛点试验。
from random import random
from time import perf_counter
DARTS=1000*1000
hits=0.0
start=perf_counter()
for i in range(1 DARTS 1):
x y=random() random()#对x、y随机撒点
dist=pow(x**2 y**2 0.5)
if dist<=1.0:#判断点是否在圆形内
hits =1
pi=4*(hits/DARTS)
print("圆周率是:{}".format(pi))
print("运行时间是:{:.5f}s".format(perf_counter()-start))
圆周率是:3.142116
运行时间是:0.92642s
from random import random #引入随机数函数
n = 1000*1000 #撒点的数量
hits = 0.0 #统计落在圆里的点的数量
for i in range(1 n 1):
x y = random() random() #随机抛点
dist = pow(x**2 y**2 0.5) #随机点到圆心的距离
if dist<=1.0:
hits = hits 1 #落在圆内部的点的数量
pi = 4*(hits/n) #圆内外点的对比
print("圆周率值是:{}".format(pi))