![]() |
Stringliste zufällig mischen
Hallo,
Ich suche einen Code eine Stringliste möglichst schnell zu mischen. Ich habe folgenden Code, der auch funktioniert, nur leider sehr langsam ist.
Delphi-Quellcode:
Kann man das auch schneller machen?
procedure Shuffle(List: TStrings);
var i: Integer; begin Randomize; List.BeginUpdate; try for i := 0 to Pred(List.Count) do List.Exchange(i, Random(List.Count)); finally List.EndUpdate; end; end; Danke |
Re: Stringliste zufällig mischen
Um welche TStrings Klasse handelt es sich genau ?
Ist es vielleicht das Property Lines von TMemo oder Items von TComboBox ? Dann sind die Zugriff stark verlangsamt, da im Hintergrund Windows Messages verschickt werden. Workararoud: alle Items auf eine echte TStringList kopieren, Daten verwürfeln und wieder zurückkopieren. |
Re: Stringliste zufällig mischen
Zitat:
Zitat:
Eine Möglichkeit wäre wohl der Umweg über ein String Array oder gibt es noch eine bessere Lösung? |
Re: Stringliste zufällig mischen
Versuch mal spasseshalber, um zu Testen, ob die Random-Funktion die Bremse ist:
Delphi-Quellcode:
procedure Shuffle(List: TStrings);
var i: Integer; begin Randomize; List.BeginUpdate; try for i := 0 to Pred(List.Count) do List.Exchange(i, (i*991+103) mod List.Count); // 991 & 103=Primzahl finally List.EndUpdate; end; end; |
Re: Stringliste zufällig mischen
Zitat:
So ist es zwar etwas umständlich, aber dafür sehr schnell:
Delphi-Quellcode:
Werde es dann wohl doch so machen, Thx@All.
procedure Shuffle3(List: TStrings);
var i, r: Integer; s: Array of String; t: String; begin SetLength(s, List.Count); for i := 0 to Pred(List.Count) do s[i] := List[i]; List.BeginUpdate; try List.Clear; for i := Low(s) to High(s) do begin //repeat r := Random(High(s)); //until r <> i; t := s[i]; s[i] := s[r]; s[r] := t; end; for i := Low(s) to High(s) do List.Add(s[i]); finally List.EndUpdate; end; end; |
Re: Stringliste zufällig mischen
also ist einfach das exchange zu langsam?! Dann gibts noch bessere Möglichkeiten
|
Re: Stringliste zufällig mischen
Hallo,
eine kleine Testprozedur: TStringList.Exchange : 0ms ListBox1.items.Exchange: 1060ms Listbox über TStringList mischen: 109ms
Delphi-Quellcode:
Grüße
procedure TForm1.Button1Click(Sender: TObject);
var sl: TStringList; i : Integer; start : TDateTime; begin sl := TStringList.create; for i:=0 to 9999 do sl.add(intToStr(i)); ListBox1.Items.Assign(sl); // durchwürfeln start := now; for i:=sl.count -1 downto (sl.count - 1) div 2 do sl.Exchange(i,random(sl.count)); showMessage('TStringList.Exchange: '+IntToStr(MilliSecondsBetween(now,start))); ListBox1.Items.BeginUpdate; start := now; for i:= ListBox1.Items.Count -1 downto (ListBox1.Items.Count -1) div 2 do ListBox1.Items.Exchange(i,random(ListBox1.Items.count)); showMessage('TListBox.items.Exchange: '+IntToStr(MilliSecondsBetween(now,start))); ListBox1.Items.EndUpdate; start := now; sl.Assign(ListBox1.items); for i:=sl.count -1 downto (sl.count - 1) div 2 do sl.Exchange(i,random(sl.count)); ListBox1.Items.Assign(sl); showMessage('TListBox über StringList.exchange: '+IntToStr(MilliSecondsBetween(now,start))); sl.free; end; Klaus |
Re: Stringliste zufällig mischen
Hi,
mischt doch nur die Indizes. Das dürfte die schnellste Methode sein. |
Re: Stringliste zufällig mischen
Zitat:
Hansa hatte freundlicherweise den Code von Exchange in diesem ![]() Grüße Klaus |
Re: Stringliste zufällig mischen
Exchange ist doch imho eine SWAP-Funktion. Warum muss die Liste, also deren Strings umsortiert werden, es reicht doch wenn nur deren Index (Integer) "sortiert" wird.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz