Es gibt verschiedene Verfahren um eine Liste zu Mischen; also in eine zufällige Unordnung zu bringen.
Der bekannteste Algorithmus dürfte der nach
Fisher-Yates sein.
Man darf sich von der Einfachheit der
procedure FisherYatesShuffle()
nicht täuschen lassen.
Beim Mischen kann man durchaus einige Fehler machen, die leider nicht sofort ins Auge fallen.
Zusätzlich sorgt der folgende Code dafür, dass z.B. das Mischen von Memo-Zeilen schnell vonstatten geht.
Hintergrund:
der Zugriff auf einzelne Strings von [TMemo].Lines, [TListbox].Items oder [TCombobox].Items ist sehr langsam. Durch das Kopieren in ein TStringList-Objekt kann die Gewschwindigkeit massiv gesteiegert werden.
Delphi-Quellcode:
procedure ShuffleTStrings(s:TStrings);
procedure FisherYatesShuffle(x:TStrings);
var
i : Integer;
begin
for i := x.Count-1 downto 1 do
x.Exchange(i, random(i+1));
end;
var
t : TStringList;
begin
Assert(Assigned(s));
if s is TStringList then
FisherYatesShuffle(s)
else
begin
t := TStringList.Create;
try
t.Assign(s);
FisherYatesShuffle(t);
s.Assign(t);
finally
t.Free;
end;
end;
end;