用python計算圓周率π
一、要求
1.要起義能計算到圓周率后面越多位越好。
2.用進度條顯示計算的進度,能給出越多種進度條越好。
3.要求給出圓周率π的具體公式或者算法說明。
二、算法
1、馬青公式:馬青公式每計算一項可以得到1.4位的十進制精度。
2、蒙特卡羅法(我們使用這種方法)
一個正方形內部相切一個圓,圓和正方形的面積之比是π/4。
在這個正方形內部,隨機產生n個點(這些點服從均勻分布),計算它們與中心點的距離是否大於圓的半徑,以此判斷是否落在圓的內部。
統計圓內的點數,與n的比值乘以4,就是π的值。理論上,n越大,計算的π值越准
三、進度條
1、time庫:
(1)perf_counter( )函數,用於測量時間,返回一個CPU級別的精確時間計數值,單位為妙,由於這個計數值起點不確定,連續調用使用差值才有意義。
(2)sleep(s)函數,產生 s妙的休眠時間,可以是浮點數,如time.sleep(3.5)。
(3)time.clock()函數,統計cpu時間 的工具,這在統計某一程序或函數的執行速度最為合適。兩次調用time.clock()函數的插值即為程序運行的cpu時間。
2、tqdm庫:Tqdm 是一個快速,可擴展的Python進度條,可以在 Python 長循環中添加一個進度提示信息,用戶只需要封裝任意的迭代器 tqdm(iterator)。
步驟如下:
(1)安裝tqdm
pip install tqd
(2)導入tqdm庫
from tqdm import tqdm
(3)tqdm示例
for i in tqdm(range(1000000)): pass
四、算法實現
1、time庫
from random import random from time import clock DARTS=100000 hits = 0.0 a=1 clock() 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== DARTS*0.01*a : print("\r%{} [{}->{}]".format(a,'*'*a,'-'*(10-a)),end="") a+=3 pi = 4* (hits/DARTS) print("\nPi=={:.7f}".format(pi)) print("運行時間為:{:.4f}s".format(clock()))
效果如下:
2、tqdm庫
from math import * from tqdm import tqdm from time import * total,s,n,t=0.0,1,1.0,1.0 clock() while(fabs(t)>=1e-6): total+=t n+=2 s=-s t=s/n k=total*4 print("π值是{:.10f} 運行時間為{:.4f}秒".format(k,clock())) for i in tqdm(range(101)): print("\r{:3}%".format(i),end="") sleep((clock())/100) #用執行程序的總時間來算出進度條間隔的時間