Python-高级进度条圆周率计算

一、圆周率的计算

方法一:采用蒙特卡罗方法,利用random库,在一个正方形中撒点,根据在1/4圆内点的数量占总撒点数的比例计算圆周率值。

    详情请看随笔:    Python-圆周率的计算【random库的应用】

方法二:梅钦公式:

                                  

方法三:一般计算公式     

            

二、普通进度条圆周率计算

  【例】梅钦公式计算的普通进度条圆周率计算

import math
import time
scale=10
print("执行开始")
t=time.process_time()
for i in range(scale+1):
    a,b='**'*i,'..'*(scale-i)
    c=(i/scale)*100
    π=4*(4*math.atan(1/5)-math.atan(1/239))
    print("[{:3}{}->{}%]".format(a,b,c))
    time.sleep(0.1)
print(π)
print("{:.3f}s".format(t))
print("执行结束")

  

三、高级进度条圆周率计算

【例】使用蒙特卡罗方法

from random import seed   #调用random中函数seed()获取随机数种子
from random import random   #调用random中函数random()
import time #导入时间模块

DARTS= 5000    #撒点数量,数越大越准
scale = 50      #文本进度条大概宽度
seed(123)      #获取唯一确定的随机数列
hits= 0.0    #开始时命中圆内部的数量
print('\n{:=^70}'.format('计算开始'))
start = time.perf_counter()
   
for i in range(1, DARTS+1):
    x, y= random(), random()    #产生点的随机坐标
    dist= pow(x**2+ y**2,0.5)     #用点与圆心的距离判断是否在圆内
    if dist<= 1.0:
        hits= hits+1
    if i%100 == 0:  #每撒点100个计时一次,共计50次
        k = i //100
        a = '*'*k
        b = '.'*(scale-k)
        c = (k/scale)*100
        dur = time.perf_counter() - start
        print("\r{:^3.0f}% [{}->{}] {:.2f}s" .format(c,a,b,dur))
pi= 4*(hits/ DARTS)     #得到圆周率的近似值
print("{:.50f}".format(pi))   #保留小数点后50位
print('\n{:=^70}'.format('计算完成'))

  

posted @ 2020-05-20 16:51  Anjora  阅读(523)  评论(0编辑  收藏  举报