Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zufallszahlen


Ich Bins - Do 23.10.03 12:51
Titel: Zufallszahlen
Hi!

Kann mir jemand sagen wie man in Delphi Zufallszahlen erzeugt? Der Randombefehl ist mir durchaus bekannt, allerdings berechnet der meiner Meinung nach die Zahlen in Abhängigkeit von Datum und Uhrzeit.

Wenn ich z.B. folgenden Quelltext hab springt der Cursor ziemlöich regelmäßigg über den Bildschirm:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Timer(Sender:TObject);
var x,y:Integer;
begin
  Randomize;
  x:=Random(500);
  y:=Random(500);
  SetCursorPos(x,y)
end;

Wenn ich das auf einen Timer mit 10 ms lege dann ist das definitiv nicht zufällig, wie soll ichs also anders machen?

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Klabautermann - Do 23.10.03 13:46

Hallo,

dein Problem ist, das du auch Randomize im Timer ereignis aufrufst. Dieses initialisiert den Random befehl und darf nur 1x beim Programmstart und nicht jedes mal beim Timer ereignis aufgerufen werden.
Verlege die entsprechende Zeile also in dein OnCreate Ereignis und dein Problem ist (wahrscheinlich) gelost.

Gruß
Klabautermann


Ich Bins - Do 23.10.03 19:54

Danke, klappt so wie du's beschrieben hast
Könntest du mir auch noch sagen warum das so regelmäßig wird wenn man Randomize jedesmal aufruft?


Klabautermann - Fr 24.10.03 10:43

Hallo,

ersteinmal kann ein Computer keine "echten" Zufallszahlen erzeugen, er kann nur berechnungen durchführen, deren ergebnis wir als menschen nicht vorhersehen können. Das macht Random. Mit jeden Aufruf von Random wird die Berechnung mit dem vorherigen ergebnis als Ausgangswert wiederholt.
Die Frage ist nur mit welchem Wert die Berechnung beginnt. Wenn man hier ein Feste Zahl nähme würde Random immer die selben ereignisse ausspucken und somit (nach ein paar durchläufen) vorhersehbar sein (das kannst du Testen in dem du Randomize weg lässt). Um das zu verhindern initalisiert man den Zufallsgenerator mit einem "für den Benutzer möglichst nicht vorhersehbaren" Wert. Sehr beliebt sind hier Zeitwerte, sei es die Laufzeit des Betriebsystems seit dem Start oder der Aktuelle Datum/Zeit Wert. Für eine solche Initialisierung ist Randomize verantwortlich.
Wenn du nun diesen Befehl mehrmals kurz nacheinander (wei in deinem Timer) aufrufst, initialisierst du den Random mechanismus immer wieder mit ähnlichen Werten und erhällst somit auch immer wieder ähnliche (oder sogar gleiche) ergebnisse. Denn es kann sein, das bei einem ähnlichen Startwerd das ergenis nur ab der 10 Stelle nach dem Komma abweicht (viele Zufallsgeneratoren berechnen ergebnisse zwischen 0 & 1 welche mann sich dan auf größere Zahlen hochrechnen muss) was dann bei Rundungen wieder verlohren geht.

Gruß
Klabautermann