Randomize Delphi?
Moin,
folgendes Program:
Pi mithilfe der Monte-Carlo-Methode in Delphi bestimmen
Wieso bekomme ich einen Wert von ~3,17 raus, wenn ich randomize in der procedure MonteCarloPi verwende?
Als ich es aus der procedure entfernt und in das Hauptprogramm eingesetzt hab, gings einwandfrei
Eigentlich sollte das doch egal sein, oder nicht?
MfG
1 Antwort
Mit Randomize wird ein zeitbasierter Seed generiert, auf dessen Grundlage bei Aufruf von Random weitere (Pseudo-)Zufallszahlen berechnet werden.
Wenn du nun Randomize innerhalb einer Schleife aufrufst (bzw. generell in allen Situationen, in denen Randomize mehrmals nacheinander aufgerufen wird), würden dir aufgrund der minimalen zeitlichen Differenz zwischen den Schleifenintervallen ständig die gleichen Seeds generiert werden.
Das einmal an einem Beispiel dargestellt:
for i := 1 to 10 do
begin
Randomize;
x := Random;
end;
Angenommen, beim ersten Schleifenintervall wird von Randomize ein Seed generiert, auf dessen Basis sich diese Zufallsreihe bilden lässt:
{ 7, 5, 19, 11, 2, ... }
Also die 7 beim ersten Folgeaufruf von Random, die 5 beim zweiten Folgeaufruf von Random, usw..
Die Variable x würde also den Wert 7 bekommen.
Beim zweiten Schleifenlauf wird wieder ein neuer Seed generiert, zu dem wegen der hohen Ausführungsgeschwindigkeit bzw. der geringen Zeitdifferenz erneut die gleiche Zufallsreihe berechnet werden kann. Die Random-Funktion liefert daher wieder die 7 zurück. Dies wird sich auch bei den nächsten Schleifenaufrufen kaum ändern.
Wenn der Seed jedoch vor der Schleife erstellt wird:
Randomize;
for i := 1 to 10 do
begin
x := Random;
end;
bekommt x bei jedem Intervall die nächste Zahl aus der berechenbaren Zufallsreihe: 7, 5, 19, etc., da sich der Seed nicht zwischenzeitlich ändert.
Die Randomize-Prozedur sollte nach Möglichkeit also immer nur einmal (z.B. zu Programmstart) aufgerufen werden.