* du könntest die Liste in 30
Teile Gruppen aufteilen, oder eine gemeinsame vielfache Anzahl der Doppelten/Mehrfachen
* dann alle Mehrfachen auf die Gruppen aufteilen
* * gleichmäßig oder per Zufall (maximal/möglichst nur je Einer pro Gruppe)
* zum Schluss die Gruppen mit den nichtmehrfachen halbwegs gleichmäßig auffüllen
* * jeweils kleinste Gruppe suchen und per Zufall einen der Einzelnen da rein
* * bis alle verteilt sind
* nun die Inhalte der Gruppen sortieren
*
die Gruppen untereinander umsortieren, besser nicht, weil dann die vorherrige Aufteilung sich wieder zufällig zusammenfinden könnte
* eventuell schauen ob in benachbarten Gruppen was zu nah zusammen und diese Beiden oder eine der Beiden neu sortieren
* * wiederholen bis OK, oder zuviele Versuche und aufgeben
* und nun die Gruppen
Oder beim Umsortieren (der gesamten Liste) jeweils schauen, ob am Ziel in der Nähe zuviele Gleiche liegen und dann dieses Austauschen der Beiden nicht machen.
Delphi-Quellcode:
for j := 0 to 10 do // mehrmals durch
for i := SL.Count-1 downto 1 do begin
x := random(i+1);
if PrüfeAnzahlDerGleichenImBereich(SL, S[i], x-20, x+20) < MaximalSovieleNahZusammen then
SL.Exchange(i, x);
end;
Delphi-Quellcode:
for j := 0 to 1000 do begin
i := random(i+1);
x := random(i+1);
if PrüfeAnzahlDerGleichenImBereich(SL, S[i], x-20, x+20) < MaximalSovieleNahZusammen then
SL.Exchange(i, x);
end;