2017-03-15 5 views
7

Für den gestrigen Pi-Tag veröffentlichte Matt Harper ein Video, in dem er Pi näher kam, indem er zwei 120-seitige Würfel 500 mal rollte (see the video here). Grundsätzlich müssen Sie für jedes Zufallszahlenpaar prüfen, ob es sich um Koprimente handelt oder nicht. Dann wird die Formel berechnet: Warum nähert sich mein Programm nicht Pi?

Sein Ergebnis war etwa 3,05, die ziemlich nahe ist.

Ich wollte sehen, was passiert, wenn mehr Rollen gemacht werden oder wenn der Bereich der zufälligen Ganzzahlen erhöht wird. Interessanterweise ergab mein Programm fast immer ein Ergebnis von 3,05 oder nahe bei ihm, egal wie hoch ich die Iterationen oder den zufälligen Bereich einstelle.

Hier ist mein Programm. Ich habe es auf Python 3.6 (Win64) ausgeführt. Der Zufallszahlengenerator, den Python benutzt, soll sehr gut sein, also habe ich vielleicht einen Fehler in meinem Programm gemacht?

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

Sah das Video gestern und dachte nicht einmal daran, es selbst zu versuchen. Danke für die Idee! Warum es nicht genau wird, idk. Meine beste Vermutung wäre eine Beschränkung des Generators, aber ich weiß wenig über Pythons Generator. – Carcigenicate

Antwort

10

Ich habe das Video nicht angesehen, aber Ihre Formel ist falsch.

Die Wahrscheinlichkeit, dass zwei zufällig von 1 bis N aufgenommene Inte- grenzen Cofrime sind, tendiert zu 6/pi^2, wenn N gegen unendlich geht. Das ist cp/(cf + cp) und nicht cp/cf.

Ersetzen Sie Ihre pi mit diesem:

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

Gibt 3,14263472915, wenn ich es auf meinem Rechner laufen.

+0

@ Random832: Das liegt daran, dass es einen weiteren Fehler gibt. Es sollte "6/(cp/total)", nicht "6/(cf/cp)" oder "6/(cf/call)" sein. – user2357112

+0

Können Sie eine Referenz für Ihre endgültige Formel angeben? Ich suche nach formalen Ableitungen, aber sie alle verwenden die Maßtheorie und ich bin nicht in der Lage, das mit Koprime und Kofaktoren zu verbinden. –

+0

@AkshatMahajan es ist einfache Algebra, es von der ursprünglichen Behauptung abzuleiten, dass P = 6/pi^2. All das komplexe Zeug wird dazu dienen, diese Behauptung zu beweisen, anstatt es in die Art und Weise zu verwandeln, wie man Pi annähern kann. – Random832

Verwandte Themen