Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Zufallsliste Zahlen 1-x erstellen


Timelesk - Mo 03.07.06 17:21
Titel: Zufallsliste Zahlen 1-x erstellen
Hallo,

ich muss für ein Programm eine Zufallsliste an Zahlen von 1 - X erstellen!
Dabei sollte jede Zahl nur 1x vorkommen, dafür aber jede!
Das ganze wird in einem aufsteigenden Array gespeichert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  //Zufallsauflistung generieren
  sl := TStringlist.Create;
  SetLength(route, anz_max);  //route: Array of Integer, anz_max: Integer
  i := 0;
  repeat
    r := random(anz_max);
    if sl.IndexOf(inttostr(r)) = -1 then
      begin
        sl.Add(inttostr(r));
        route[i] := r;
        inc(i);
      end;
  until i = anz_max;
  sl.Free;


Durch die Stringlist wird ja somit überprüft, ob die Zahl schon existiert!
Aber mir erscheint das ganze irgendwie "unsauber" gecodet! Gerade durch die Stringlist!
Mein 2. Problem wäre, wenn die maximale Zahl z.B. > 100 wird! Dann würde es aus der Überlegung heraus vorkommen können, dass er teilweise 2-3 Sekunden braucht, bis er die Liste erstellt hat.

Gibt es hierfür eine elegantere Lösung?

Vielen herzlichen Dank

gruß
Timelesk


Narses - Mo 03.07.06 17:30

Moin!

Guckst du [http://www.delphi-forum.de/viewtopic.php?p=328898#328898]! ;)

cu
Narses


Timelesk - Mo 03.07.06 19:55

vielen dank,
bin über die suche leider net drüber gestolpert!
aber funktioniert einwandfrei!


Narses - Mo 03.07.06 22:57

Moin!

Wenn dein Problem gelöst ist, markierst du den Thread dann noch entsprechend? Danke. ;)

cu
Narses


catweasel - Mi 05.07.06 14:46

Hi,

wurde hier auch schonmal behandelt und is eigentlich besser als dieses "Durchschuetteln"

http://www.delphi-forum.de/viewtopic.php?t=20163&highlight=zufallszahlen

Is schon laenger her, aber das Ergebnis produziert diese Liste ohne jeden Vergleich.
Die Idee mit der Stringlist liegt im Prinzip auch hier zugrunde, nur dass der "numberspace" fuer die Randomfunktion konstant abnimmt und gezogene Elemente im Array nach hinten wandern.
Der Unterschied zum "Durchschuetteln" ist, das selbst wenn random(x) bei jedem Aufruf den gleichen Wert liefert, lediglich die Orginalfolge abgebildet wird (ist ja immerhin eine der vielen legitimem Moeglichkeinten).
Das "zufallisieren" von n Zahlen benoetigt exakt n Iterationen. Kein best- oder worst case... Einfach lineare Laufzeit....


(Is doch dann linear, oder... Keine mich mit Komplexitaetstheorie nich so gut aus)... :-)


Cheers :-)
Catweasel