Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Zufallsgenerator mehrmals starten
ggehrma - So 25.09.05 12:49
Titel: Zufallsgenerator mehrmals starten
Hallo,
Ich habe folgendes Problem:
Ich möchte eine Menge von Zahlen in eine zufällige Reihenfolge bringen. Ich hab das jetzt so gemacht, dass ich die Zahlen alle in eine StringList geschrieben habe und dann über Randomize und Random einen zufälligen Index der StringList herausgesucht habe. Wenn ich jetzt den Vorgang erneut mit der ursprünglichen Liste starte, kommt wieder die gleiche Reihenfolge wie beim ersten Mal.
Kann ich das irgendwie ändern oder liegt das an Randomize + Random und kann nicht verändert werden?
mfg, ggehrma
ggehrma - So 25.09.05 13:10
Hier ist der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| procedure TfrmMain.btnShuffleClick(Sender: TObject); var i,x: Integer; RandomIndex: Integer; Shuffle: PShuffle; begin lsvTracklist.Clear; ShuffleList.Create; i := 0; Randomize; REPEAT RandomIndex := Random(TrackList.Count); IF ShuffleList.IndexOf(IntToStr(RandomIndex)) = -1 THEN ShuffleList.Add(IntToStr(RandomIndex)); IF ShuffleList.Count = TrackList.Count THEN i := 1; UNTIL i = 1; FOR x := 0 TO TrackList.Count - 1 DO BEGIN Shuffle := PShuffle(TrackList.Objects[x]); Shuffle.ShuffleIndex := StrToInt(ShuffleList.Strings[x]); END; FOR x := 0 TO ShuffleList.Count-1 DO BEGIN Shuffle := PShuffle(TrackList.Objects[x]); WITH lsvTrackList.Items.Add DO BEGIN Caption := IntToStr(x+1); SubItems.Add(ExtractFileName(TrackList.Strings[Shuffle.ShuffleIndex])); SubItems.Add(ExtractFilePath(TrackList.Strings[Shuffle.ShuffleIndex])); SubItems.Add(IntToStr(Shuffle.ShuffleIndex)); END; END; end; |
delfiphan - So 25.09.05 13:24
Randomize musst du nur ein mal beim Start des Programmes ausführen.
alzaimar - So 25.09.05 13:34
Ganz einfach, nachdem Du korrekt (vielleicht ein wenig umständlich) die ShuffleList erzeugst, verwendest Du sie gar nicht!.
Hier ist eine bessere (und schnellere) Möglichkeit, eine ShuffleList zu erzeugen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Var ShuffleList : Array Of Integer; h,n,i,j : Integer;
Begin n := TrackList.Count; setLength (ShuffleList, n); For i:=0 to n-1 do ShuffleList[i] := i; For i:=0 to n-1 do Begin j := Random (n - i + 1); h := ShuffleList[j]; ShuffleList[j] := ShuffleList[i]; ShuffleList[i] := h; End; End; |
ggehrma - So 25.09.05 13:46
Na klar verwende ich die ShuffleList:
Delphi-Quelltext
1:
| Shuffle.ShuffleIndex := StrToInt(ShuffleList.Strings[x]); |
@alzaimar:
Leider kann ich deine Version nicht verwenden, da ich meinen Record auf den ich über die Variable
Shuffle zugreife noch weiter benötige.
Wenn ich Randomize nur einmal ganz am Anfang des Programms ausführe, passiert leider der selbe Fehler.
ggehrma - So 25.09.05 13:57
OK, hab das Problem jetzt selber gelöst:
Hab einfach statt ShuffleList.Create ein ShuffleList.Clear gesetzt und das ShuffleList.Create ganz an den Programm-Anfang.
Trotzdem Danke für eure Vorschläge.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!