2017-03-15 41 views
7

對於昨天的Pi Day,Matt Harper發表了一段視頻,他通過滾動兩個120面的骰子500次(see the video here)來逼近Pi。基本上,對於每一對隨機數字,你必須檢查它們是否是互斥的。然後,公式爲爲什麼我的程序不適合pi?

pi = sqrt(6/(n_coprimes/n_cofactors)) # EDIT: Wrong premise. Misremembered the formula. 

被計算。

他的結果約爲3.05,這相當接近。

我想看看更多的卷完成或隨機整數的範圍增加時會發生什麼。有趣的是,無論我設置迭代次數或隨機範圍多高,我的程序幾乎總是給出3.05或接近它的結果。

這是我的程序。我在Python 3.6(Win64)上運行它。 Python使用的隨機數生成器應該非常好,所以也許我在程序中犯了一個錯誤?

import random 
from math import gcd, sqrt 

def pi(cp, cf): 
    return sqrt(6/(cf/cp)) # EDIT: Second error - switched numerator/denominator... 

coprime = 0 
cofactor = 0 

iterations = 1000000 

for i in range(iterations): 
    x = random.randint(0,1000000) 
    y = random.randint(0,1000000) 
    if gcd(x,y) > 1: 
     cofactor += 1 
    else: 
     coprime += 1 

print(pi(coprime, cofactor)) 
+0

昨天看了視頻,甚至沒有想到自己試試這個。感謝您的想法!至於爲什麼它不獲得準確性,idk。我最好的猜測是發生器的限制,但我對Python的生成器知之甚少。 – Carcigenicate

回答

10

我還沒有看過視頻,但是你的公式是錯誤的。

隨着N趨於無窮大,兩個整數從1到N隨機挑選的概率趨於6/pi^2。這是cp /(cf + cp)而不是cp/cf。

更換您的pi這個:

def pi(cp, cf): 
    fcp = cp/float(cp + cf) 
    return sqrt(6/fcp) 

給人3.14263472915當我在我的機器上運行它。

+0

@ Random832:這是因爲還有另一個錯誤。它應該是'6 /(cp/total)',而不是'6 /(cf/cp)'或'6 /(cf/total)'。 – user2357112

+0

你能否引用你的最終公式?我正在尋找正式的推導,但他們都使用度量理論,我無法將其與coprimes和輔助因子連接起來。 –

+0

@AkshatMahajan它是簡單的代數,可以從P = 6/pi^2的原始斷言中推導出它。所有複雜的東西都將證明這個斷言,而不是將其轉化爲如何近似pi。 – Random832

相關問題