Thema: Delphi randomize result ???

Einzelnen Beitrag anzeigen

Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#18
  Alt 11. Jan 2003, 12:53
Hi Hansa,

ich glaube, du hast noch nicht ganz verstanden, was wir meinen. Angenommen, du schreibst (als einfaches Beispiel) ein Programm, das eine Lottoziehung simuliert. Dann brauchst du schnell 6 bzw. 7 Zufallszahlen hintereinander. Ein Code der so aussähe
Delphi-Quellcode:
var
  numbers: arrray[0..6] of Integer;

procedure GetNumbers();
var
  i: Integer;
begin
  for i := 0 to 6 do begin
    Randomize();
    numbers[i] := Random(7) + 1;
  end;
end;
liefert dir sieben mal die gleiche Zufallszahl, weil nämlich in der Regel auf heutigen Prozessoren so wenig Zeit vergeht, dass ein Achzehntelsekundenschritt nicht auftritt (selbst wenn, dann erhältst du zwei unterschiedliche Zahlen, das ist auch nicht, was du willst).

Folgender Code wäre richtiger:
Delphi-Quellcode:
procedure GetNumbers();
var
  i: Integer;
begin
  Randomize();
  for i := 0 to 6 do
    numbers[i] := Random(49) + 1;
end;
Hier wird Randomize() nur einmal pro Ziehung aufgerufen, das heißt, du bekommst sieben verschiedene Pseudo-Zufallszahlen (die können zwar doppelt vorkommen, aber das Prinzip ist ja wohl klar). Wenn du GetNumbers() nicht oft hintereinander aufrufst, ist das okay.

Der kleine Haken dabei ist nur: Randomize() braucht Rechenzeit - minimal aber trotzdem. Möglicherweise möchtest du aber auch tausend mal hintereinander GetNumbers() aufrufen. Dann musst du das natürlich anders machen:

Delphi-Quellcode:
var
  numbers: array[0..999][0..6] of Integer;

procedure GetNumbers(element: Integer);
var
  i: Integer;
begin
  for i := 0 to 6 do
    numbers[element][i] := Random(49) + 1;
end;

procedure CallGetNumbers();
var
  i: Integer;
begin
  Randomize();
  for i := 0 to 999 do
    GetNumbers(i);
end;
Randomize() wird nur einmal aufgerufen, man bekommt 7000 "ungleiche" Pseudo-Zufallszahlen.

Der Punkt ist, dass die letzte Möglichkeit in jedem Falle die beste ist, da sie am wenigsten rechenzeit braucht (da Randomize() nur einmal aufgerufen wird) und außerdem am wenigsten fehleranflällig ist. Daher ist es sinnvoll, immer diese Möglichkeit zu empfehlen.

Also noch einmal ganz deutlich: Am besten ist es, Randomize() nur einmal im ganzen Programm aufzurufen. Am besten im Project-File (View|Project Source) oder, wenn man nur ein Formular benutzt, im OnCreate-Ereignis.

MfG,
d3g

[edit]Hab ich wohl ein bisschen lange getippt... [/edit]
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat