Randomize Delphi?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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.