def calculatePI1(): #模拟统计法:蒙特卡罗方法计算圆周率
import random as r #导入random模块命名为r
import math as m #导入math模块命名为m
import time as t #导入time模块命名为t
darts = int(input("Please input darts numbers:")) #选择投掷次数,控制计算精度,darts越大越精确
hits = 0 #初始记投掷在圆内次数为0
#t.clock() #调用time模块中的clock()函数,计时开始
star_time = t.time() #开始时间
for i in range(darts): #若要取1/4圆简化计算通过下行random()实现,取全圆计算则通过下下行uniform()实现
#x,y=r.random(),r.random() #random()产生[0,1)之间的随机小数,则规定边长为1的正方形,内切圆圆心为(0.5,0.5)半径为0.5,坐标大小范围为(0,1)
x, y = r.uniform(-1, 1), r.uniform(-1, 1) #uniform(a,b)产生[a,b]之间的随机小数,则规定边长为2的正方形,则内切圆圆心为(0,0),半径为1,坐标大小范围为(-1,1)
distance = m.sqrt((x**2+y**2)) #坐标(x,y)到原点距离distance
if distance <= 1: #如果distance<=1(半径),
hits+=1 #则此坐标在1/4圆内,hits+1;
else: #否则坐标在1/4圆外,
continue #循环继续
end_time=t.time() #结束时间
running_time=end_time-star_time #计算时间=结束时间-开始时间
#print("The running time is {}.".format(t.clock())) #计时结束
print("The running time is {}.".format(running_time)) #打印计算时间
PI=4*(hits/darts) #注:此处乘以4是因为(圆内点数/总点数)的值为Π/4,与是否取1/4圆无关
return PI
def calculatePI2(): #统计法(穷举法)计算圆周率,其原理与蒙特卡罗法基本一致,区别在于点数获取方式
#import math as m
from time import time
N = int(input("Please input N{(x,y)|x,Y∈N}:")) #输入N(N**2为所有点个数,也是坐标(x,y)取值范围),N值越大越精确
step = input("Please input the step(int) between two points:") #输入均分整数步数,step越小越精确
#上两行及下面for循环双重循环中可通过导入numpy模块实现通过小数计算
r = N / 2 #正方形内切圆半径
#print("({0},{0})".format(r)) #打印输出圆心坐标
counts = 0 #圆内点数计次
c = int(step)
star_time = time() #开始时间
for x in range(0,N+1,c): #x坐标
for y in range(0,N+1,c): #y坐标
#print(x,y) #打印每个坐标
distance2 = (x - r) ** 2 + (y - r) ** 2 #坐标(x,y)到圆心的距离的平方distance2
if distance2<=r*r: #如果distance2<=r*r,
#print(x,y) #打印在圆内点坐标
counts+= 1 #则此坐标在圆内,counts+1;
else: #否则坐标在圆外,
continue #循环继续
end_time = time() #结束时间
running_time = end_time - star_time #计算时间=结束时间-开始时间
print("The running time is {}.".format(running_time)) #打印计算时间
#print(counts) #在圈内坐标个数
PI=4*(counts/N**2) #(圆内坐标个数counts/总点数N**2)值为Π/4,所以乘以4
return PI
def calculatePI3(): #BBP公式求圆周率
from time import time #导入time模块
PI=0
N=int(input("Please input N:"))
star_time = time() # 开始时间
for k in range(N):
PI+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6)) #BBP公式
end_time = time() # 结束时间
running_time = end_time - star_time # 计算时间=结束时间-开始时间
print("The running time is {}.".format(running_time)) # 打印计算时间
return PI
附上BBP公式简介:
贝利-波尔温-普劳夫公式 ( BBP 公式) 提供了一个计算圆周率π的第n位二进制数的spigot算法(spigot algorithm)。 这个求和公式是在1995年由西蒙·普劳夫提出的,并以公布这个公式的论文作者大卫·贝利(DavidH. Bailey)、皮特·波尔温(PeterBorwein)和普劳夫的名字命名。 在论文发表之前,普劳夫已将此公式在他的网站上公布。



