您的位置 首页 kreess

π怎麼算的,我們可以精確到多少位?

​ π等於3.1415926,相信大部分人初中都背過;目前圓周率已經精確至小數點後62.8億位,這是21年8月份,瑞典研究員用一臺超級計算機,算瞭108天得出;相當於

​ π等於3.1415926,相信大部分人初中都背過;目前圓周率已經精確至小數點後62.8億位,這是21年8月份,瑞典研究員用一臺超級計算機,算瞭108天得出;相當於我梁山好漢,每人算一天,方法好是好,就是有點費好漢。

那π是怎麼算的呢?,我們又可以精確至多少位呢?,我這邊找瞭兩種方法實驗;首先π就是半徑為1的圓的面積(s=π*r**2),因此可以轉化為計算圓的面積

方法一、蒙特卡羅法,顧名思義他是由數學傢馮·諾伊曼等提出,蒙特卡羅其實是摩洛哥的一座賭城,以前我一直以為他是個人,哈哈。當然該方法很早就被使用瞭,隻是馮·諾伊曼等人對其進行瞭一個總結。

賭城-蒙特卡羅賭城

蒙特卡羅是通過實驗,進行概率統計計算出圓的面積;如下圖所示,我們往正方形中扔黃豆,然後計算黃豆落在圓中的概率p(落在圓裡的黃豆量/落在正方形中的黃豆量),S圓=S正方形*p

可以精確到小數點後4位,還是可以的,不過由於是概率性的東西,不會特別精確。話不多說上python。

import random
import numpy as np

if __name__=="__main__":
pi_true = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"
pi_true = str(pi_true).split(".")[1]
counts = [10**7,5*10**7,10**8,5*10**8,10**9]
acc = []
for n in counts:
r = 0.5
in_circle = 0
for _ in range(n):
x,y = random.random(),random.random()
if (x-0.5)**2+(y-0.5)**2<=r**2:
in_circle +=1

pi_pred = (in_circle/n)/r**2
pi_pred = str(pi_pred).split(".")[1]
d = 0
for i in range(min(len(pi_pred),len(pi_true))):
if pi_pred[i]==pi_true[i]:
d+=1
print("扔%d豆子,可以精確至第:%d位"%d)
acc.append(d)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部