MonteCarlo < Algor.+Datenstr. < Theoretische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) überfällig | Datum: | 13:16 So 24.09.2006 | Autor: | Phecda |
hi
ich hab mit delphi eine montecarlo-simulation geschrieben um pi zu berechnen. Mir ist dabei aufgefallen, dass ich selbst bei einer großen Anzahl von Würfen stets einen Fehler um ca. 0,3% im mittel habe. (Ich habe zusätzlich mehrere Testreihen durchgeführt und die Standardabweichung vom Mittelwert des Fehlers berechnet. und siehe da, je größer die anzahl der würfe bei jeder simulation ist umso geringer wird im mittel die Standardabweichung vom Fehlermittelwert)
wie kann man diesen Sachverhalt erklären, dass nähmlich bei größerwerdenden Wurfanzahl der Fehler bei der Pi-Berechnung gegen 0,3% im mittel konvergiert?
Ich könnte mir erklären, dass der Zufallsgenerator, wenn er so viele zahlen generieren muss, eine gewisse struktur in den pseudozufallszahlen erzeugt, dei zu diesem konstanten Fehler führen???
oder ist es ein innermathematisches Problem, dass die MonteCarlo-Simulation nur um einen Wert "oszilliert" aber nicht mit größerwerdenden Wurfversuchen pi näher berechnet?
Hab in delphi den standardzufallsgenerator
randomize & random()
benutzt. Gibt es andere bessere zufallsgeneratoren in delphi, bzw. sind die zufallsgeneratorn in anderen sprachen (c++, vb) "zufälliger"
danke
mfg Phecda
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:07 Fr 29.09.2006 | Autor: | mathwizard |
Hallo,
Mit welchem Wert von Pi hast du deine Lösung verglichen.
Welchen Wert bekommst du für Pi ?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:49 Mo 09.10.2006 | Autor: | MyChaOS |
Schick doch mal bitte die relevanten Codeausschnitte. Ich habe mal für die Schule ebenfalls ein MonteCarlo-Pi geschrieben, und dabei keinerlei Konvergenz gegen einen bestimmten Fehler gemerkt, bekommen fehler unter 0,01%. (Delphi 2005 .Net)
for i := 1 to StrToInt(edPoints.Text) do
begin
P := TMyPoint.Create(randomPoints);
p.x := random;//liefert [0..1]
p.y := random;//liefert [0..1]
inc(ipoints);
if (sqr(p.x) + sqr(p.y)) <= 1 then
inc(iCircle)
else
inc(iOutofCircle);
end;
dProb := iCircle / iPoints;
lbl_Probability.Caption := dProb.ToString;
dPi := dProb*4;
lbl_Pi.Caption := dPi.ToString;
derror := abs(dpi-pi)/pi*100;
lbl_error.Caption := derror.ToString;
Randomize benutze ich einmal Eingangs in form create
random benutzt du schon ohne parameter oder?
lass doch mal deine Punkte grafisch ausgeben, dann siehst vllt einen Fehler
|
|
|
|