Listbox.Items zufällig mischen
-
- Beiträge: 29
- Registriert: Mi 27. Mai 2009, 08:48
- OS, Lazarus, FPC: Linux (L 0.9.26.2-0 FPC 2.2.2)
- CPU-Target: 32Bit
Listbox.Items zufällig mischen
Schönen guten Tag!
Ich habe eine Listbox mit vielen Items, die ich jetzt zufällig mischen möchte, also dass jedes Item an einem anderen ItemIndex ist und andere Nachbarn hat. Also einfach die Items mixen. Leider fällt mir nicht recht ein, wie ich das machen könnte. Ich dachte vielleicht an ein Ziehen ohne Zurücklegen, also das jedes Item eine andere Zeilennumer bekommt und dann so verschoben wird.
Ich hoffe jemand kann mir bei meinem Problem helfen oder mir Ansätze zeigen.
Schon mal Vielen Dank im Voraus!
Alci
Ich habe eine Listbox mit vielen Items, die ich jetzt zufällig mischen möchte, also dass jedes Item an einem anderen ItemIndex ist und andere Nachbarn hat. Also einfach die Items mixen. Leider fällt mir nicht recht ein, wie ich das machen könnte. Ich dachte vielleicht an ein Ziehen ohne Zurücklegen, also das jedes Item eine andere Zeilennumer bekommt und dann so verschoben wird.
Ich hoffe jemand kann mir bei meinem Problem helfen oder mir Ansätze zeigen.
Schon mal Vielen Dank im Voraus!
Alci
Re: Listbox.Items zufällig mischen
Eine Variante, bei der man nicht viel nachdenken muss:
Code: Alles auswählen
function RandomSort(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := -1 + Random(3);
end;
procedure TForm1.Button1Click(Sender: TObject);
var sl:TStringList;
begin
Randomize;
sl:=TStringList.create;
sl.Assign(Listbox1.Items);
sl.CustomSort(@RandomSort);
ListBox1.Items.Assign(sl);
sl.free;
end;
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: Listbox.Items zufällig mischen
Oder etwas "zufälliger": Du erstellst eine Liste mit Intergerwerten deiner TStringList-Indizes, wählst dann zufällig einen Eintrag per z:=random(aList.Count); aus, kopierst den String mit diesem Index in eine neue Liste und löscht den Wert aus der anderen Liste.
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Listbox.Items zufällig mischen
theo hat geschrieben:Eine Variante, bei der man nicht viel nachdenken muss:
Gibt dies keine Probleme mit dem Quicksort-Algorithmus? Der ist doch darauf angewiesen, dass die Vergleiche konsistente Ergebnisse erzeugen?
Re: Listbox.Items zufällig mischen
mse hat geschrieben:Gibt dies keine Probleme mit dem Quicksort-Algorithmus? Der ist doch darauf angewiesen, dass die Vergleiche konsistente Ergebnisse erzeugen?
Zum Durchmischen scheint's zu reichen. Ich hab's nicht theoretisch analysiert.
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Listbox.Items zufällig mischen
theo hat geschrieben:Zum Durchmischen scheint's zu reichen. Ich hab's nicht theoretisch analysiert.
Bleibt das Sortieren nie hängen?
Re: Listbox.Items zufällig mischen
mse hat geschrieben:Bleibt das Sortieren nie hängen?
Was meinst du damit? Bei mir hängt nichts, jedenfalls nicht nach ein paar Millionen mal sortieren...
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Listbox.Items zufällig mischen
Bei fehlerhafter Quicksort Vergleichsfunktion welche bei gleichen Werten nicht immer das gleiche Resultat liefert, kann es vorkommen, dass der Quicksort Algorithmus nicht terminiert.
Re: Listbox.Items zufällig mischen
mse hat geschrieben:Bei fehlerhafter Quicksort Vergleichsfunktion welche bei gleichen Werten nicht immer das gleiche Resultat liefert, kann es vorkommen, dass der Quicksort Algorithmus nicht terminiert.
Wo soll er denn hängen? Die Vergleichsfkt. gibt ja immer was anderes zurück.
-
- Beiträge: 29
- Registriert: Mi 27. Mai 2009, 08:48
- OS, Lazarus, FPC: Linux (L 0.9.26.2-0 FPC 2.2.2)
- CPU-Target: 32Bit
Re: Listbox.Items zufällig mischen
theo hat geschrieben:Eine Variante, bei der man nicht viel nachdenken muss:Code: Alles auswählen
function RandomSort(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := -1 + Random(3);
end;
procedure TForm1.Button1Click(Sender: TObject);
var sl:TStringList;
begin
Randomize;
sl:=TStringList.create;
sl.Assign(Listbox1.Items);
sl.CustomSort(@RandomSort);
ListBox1.Items.Assign(sl);
sl.free;
end;
Das funktioniert sehr gut, kannst du mir noch genauer erklären, wie der Algorithmus funktioniert?
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Listbox.Items zufällig mischen
theo hat geschrieben:Wo soll er denn hängen? Die Vergleichsfkt. gibt ja immer was anderes zurück.
Dann ist ja alles in Ordnung, nicht?
Re: Listbox.Items zufällig mischen
mse hat geschrieben:theo hat geschrieben:Wo soll er denn hängen? Die Vergleichsfkt. gibt ja immer was anderes zurück.
Dann ist ja alles in Ordnung, nicht?
"Wo soll er denn hängen?" war eine Frage, keine Feststellung.
Re: Listbox.Items zufällig mischen
Alci hat geschrieben:Das funktioniert sehr gut, kannst du mir noch genauer erklären, wie der Algorithmus funktioniert?
Die TStringList (auch die TList) hat einen eingebauten Quicksort.
Diesem kann man eine Vergleichsfunktion übergeben, die normalerweise über grösser, kleiner, gleich zweier Elemente bestimmt.
Dies wird nun "missbraucht" um zufällige Vergleichsresultate zu generieren.
mse hat allerdings Einwände gegen dieses Vorgehen, die er - so Gott will - nun formulieren möge.
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Listbox.Items zufällig mischen
theo hat geschrieben:mse hat allerdings Einwände gegen dieses Vorgehen, die er - so Gott will - nun formulieren möge.
Also, ich habe es durch fehlerhaft und schluderig programmierte compare() funktionen schon öfters geschafft, einen Quicksort nicht mehr terminieren zu lassen. Daher ist mir das übergeben von Zufallsergebnissen in compare() etwas unheimlich, ich glaube nicht, dass dies im Sinne des Quicksort-Erfinders ist.
Re: Listbox.Items zufällig mischen
mse hat geschrieben:ich glaube nicht, dass dies im Sinne des Quicksort-Erfinders ist.
Deshalb sage ich ja auch "missbraucht"
Ich kann aber keinen ewigen loop damit provozieren.
Schaffst du das?