Listbox.Items zufällig mischen

Für Fragen von Einsteigern und Programmieranfängern...
Alci
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

Beitrag von Alci »

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

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Listbox.Items zufällig mischen

Beitrag von theo »

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;

Scotty
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

Beitrag von Scotty »

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.

mse
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

Beitrag von mse »

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?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Listbox.Items zufällig mischen

Beitrag von theo »

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.

mse
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

Beitrag von mse »

theo hat geschrieben:Zum Durchmischen scheint's zu reichen. Ich hab's nicht theoretisch analysiert.

Bleibt das Sortieren nie hängen?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Listbox.Items zufällig mischen

Beitrag von theo »

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...

mse
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

Beitrag von mse »

Bei fehlerhafter Quicksort Vergleichsfunktion welche bei gleichen Werten nicht immer das gleiche Resultat liefert, kann es vorkommen, dass der Quicksort Algorithmus nicht terminiert.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Listbox.Items zufällig mischen

Beitrag von theo »

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.

Alci
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

Beitrag von Alci »

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? ;)

mse
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

Beitrag von mse »

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? ;-)

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Listbox.Items zufällig mischen

Beitrag von theo »

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.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Listbox.Items zufällig mischen

Beitrag von theo »

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.

mse
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

Beitrag von mse »

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.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Listbox.Items zufällig mischen

Beitrag von theo »

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?

Antworten