ich habs mal in pb umgeschrieben und etwas verändert
Code: Alles auswählen
#genauigkeit = 10000000
#rand_genauigkeit = 100000
start = ElapsedMilliseconds()
Procedure.d pi(tropfenzahl.l)
pi.d = 0
innerhalb.l = 0
gesamt.l = tropfenzahl
While tropfenzahl > 0
; generiere Tropfen und addiere je nach Zugehörigkeit
dotx.d = 2 * (Random(#rand_genauigkeit)/#rand_genauigkeit) - 1
doty.d = 2 * (Random(#rand_genauigkeit)/#rand_genauigkeit) - 1
If (dotx*dotx + doty*doty <= 1)
; Punkt liegt innerhalb des Kreises
innerhalb+1
Else
; Punkt liegt außerhalb des Kreises
EndIf
tropfenzahl-1
Wend
pi = 4*innerhalb/gesamt
ProcedureReturn pi
EndProcedure
MessageRequester("PI","Pi:"+Chr(9)+StrD(pi(#genauigkeit))+Chr(10)+"Zeit:"+Chr(9)+Str(ElapsedMilliseconds()-start)+" Ms")
Gedanke hinter der Sache:
Man nehme ein Quadrat.
in diesem Quadrat ist ein Viertelkreis
Nun setze man zufällig punkte in dieses Quadrat und man zählt, wie viele im Viertelkreis liegen, und wie viele nicht.
Natürlich ungenau , weil die Punkte ja zufällig gesetzt werden, dafür ist die konstante #genauigkeit, sie bestimmt die anzahl der punkte.
die konstante #rand_genauigkeit ist für die anzahl der Nachkommastellen bei random.
Spiel mal ein bisschen damit rum und gucke, wie die ausgaben aussehen.
Achtung: bei mir (1000MHz) hat das Beispiel oben ca 3 Sekunden gebraucht
Die Genauigkeit ist nicht der Hammer, aber es ist ein Ansatz.
Um genauer zu werden, vielleicht anstatt Kommazahlen, einfach sozusagen pi*1000000 nehmen um zu rechnen und nur zur anzeige das Komma setzen.
Desweiteren nicht die punkte zufällig nehmen, sondern in einem bestimmten Abstand, und somit auch die genauigkeit bestimmen.
Ich hoffe du verstehst was ich meine.
Ich gehe jetzt erstmal off und werde heute abend wieder vorbeischauen.