2017-03-15 7 views
7

昨日のPi Dayでは、マット・ハーパーは2つの120面のサイコロを500回転がしてPiを近似したビデオを公開した(see the video here)。基本的には、乱数の各ペアについて、それらが共起しているかどうかをチェックする必要があります。次に、式私のプログラムはなぜ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

私はビデオを見たことがありませんが、あなたの数式は間違っています。

1からNまでランダムに選んだ2つのintが共起する確率は、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/cp)'や '6 /(cf/total)'ではなく '6 /(cp/total)'でなければなりません。 – user2357112

+0

あなたは最終的な公式の参考文献を挙げることができますか?私は正式な派生を探していますが、彼らはすべて尺度理論を採用しており、私はそれを援助者や補因子につなげることはできません。 –

+0

@AkshatMahajan P = 6/pi^2という元のアサーションからそれを導き出すのは簡単な代数です。すべての複雑なものは、アサーションをpiを近似する方法に変換するのではなく、そのアサーションを証明することになります。 – Random832

関連する問題