// Die Prozedur kann Zufallszahlen von 0 bis (höchstens) 65534 erstellen, kann das
// Mehrfachvorkommen von Zahlen auf Wunsch unterdrücken sowie die Zahlen sortieren.
// Die Zahlen werden in dem Array "f" abgelegt.
// Zusätzlich kann mit einem Startwert für den Zufallsgenerator festgelegt werden,
// ob immer neue zufällige Zahlenreihen erzeugt werden
(0), oder ob eine
// Zufallsfolge immer wieder reproduziert wird
(1..4294967295).
// Im Beispiel werden 500 Zahlen von 0 bis einschl. 1000 erzeugt, gleiche Zahlen
// werden unterdrückt, die Zahlen werden sortiert und es werden immer neue
// Zahlenreihen generiert.

// Getestet mit D4 unter Win98

var 
  f: array of word; 
  Anzahl: word; 
 
function zufallszahlen(Minzahl, Maxzahl: word; 
  GleicheErlaubt, Sortiert: boolean; Startwert: longword): boolean; 
var z, x: word; 
begin 
  result := false; 
  if maxzahl > 65534 then begin 
    showmessage('Der Maximalwert darf 65534 nicht übersteigen'); 
    exit; 
  end; 
  if anzahl > ((maxzahl - minzahl) div 2) then begin 
    showmessage('Anzahl ist für ordnungsgemäßes Arbeiten zu hoch'); 
    exit; 
  end; 
  try 
    if startwert = 0 then randomize else 
      randseed := startwert - 2147483648; 
    for x := 0 to length(f) - 1 do f[x] := $FFFF; 
    repeat 
      z := random(maxzahl - minzahl + 1) + minzahl; 
      for x := 0 to anzahl - 1 do begin 
        if (f[x] = z) and (not GleicheErlaubt) then break; 
        if (z < f[x]) and sortiert then 
          if (x < anzahl - 1) then begin 
            move(f[x], f[x + 1], sizeof(f[x]) * (anzahl - x)); 
            f[x] := z; 
            break; 
          end; 
        if f[x] = $FFFF then begin 
          f[x] := z; 
          break; 
        end; 
      end; 
    until f[anzahl - 1] < $FFFF; 
  except 
    exit; 
  end; 
  result := true; 
end; 
 
procedure TForm1.Button2Click(Sender: TObject); 
var x: integer; 
begin 
  screen.cursor := crHourglass; 
  RichEdit1.lines.beginupdate; 
  RichEdit1.clear; 
  Anzahl := 500; 
  setlength(f, anzahl); 
  if zufallszahlen(0, 1000, false, true, 0) then 
    for x := 0 to anzahl - 1 do RichEdit1.lines.add(inttostr(f[x])); 
  f := nil;  // falls es nicht mehr gebraucht wird 
  RichEdit1.lines.endupdate; 
  screen.cursor := crDefault; 
end; 


Zugriffe seit 6.9.2001 auf Delphi-Ecke