python计算圆周率(蒙特卡洛法/模拟法、统计法/穷举法、BBP公式)

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)和普劳夫的名字命名。 在论文发表之前,普劳夫已将此公式在他的网站上公布。
BBP公式

你可能感兴趣的:(python初学,笔记,python,算法,几何学)