Autor Beitrag
Ich Bins
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 197

Win XP Prof
D5 Prof
BeitragVerfasst: Do 23.10.03 12:51 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 197

Win XP Prof
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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