delphi - versiones - Aleatorizar StringList
delphi xe2 full (3)
Para aleatorizar una TStrings
, cree un comparador de TComparer
con un valor de resultado aleatorio y ordene las TStrings
con él.
/// The Comparer
TMyShuffleComparer= class(TComparer<string>)
public
function Compare(const Left, Right: string): Integer; override;
end;
/// The randomizer
function TMyShuffleComparer.Compare(const Left, Right: TCard): Integer;
begin
// To sort, get a random number for compare result
Result := Random(100) - 50;
end;
/// How to call the comparer
procedure TMyStrings.Shuffle;
begin
Sort(TMyShuffleComparer.Create);
end;
o para llamar directamente:
/// Shuffle
MyString.Sort(TMyShuffleComparer.Create);
¿Cómo puedo aleatorizar las cadenas en StringList de forma similar cómo funciona esta herramienta en línea? Si alguien está familiarizado con esto, verifique esto: http://textmechanic.co/Randomize-List.html
Simplemente recorra la lista de cadenas y dé a cada elemento un lugar aleatorio diferente:
for i := StringList.Count - 1 downto 1 do
StringList.Exchange(i, Random(i+1));
[edit] Alterado el loop un poco para hacer que el cambio de look sea uniforme.
Un algoritmo común para realizar un shuffle es el barajado de Fisher-Yates . Esto genera permutaciones distribuidas uniformemente.
Para implementar en un objeto Delphi TStrings
puede usar esto:
procedure Shuffle(Strings: TStrings);
var
i: Integer;
begin
for i := Strings.Count-1 downto 1 do
Strings.Exchange(i, Random(i+1));
end;
Ahora, aunque en teoría esto generará permutaciones distribuidas uniformemente, el rendimiento real depende en gran medida de la calidad del generador de números aleatorios. Esto se discute en Knuth''s Art of Computer Programming, volumen 2, sección 3.4.2, Algoritmo P.
Otras lecturas:
- Mezcla de Fisher-Yates (Wikipedia)
- Dos artículos de blog de Jeff Attwood sobre la mezcla: Shuffling y The Danger of Naïveté
- La intuición detrás de la mezcla de Fisher-Yates (Eli Bendersky)
- Arte de la programación de computadoras , Donald Knuth, volumen 2, sección 3.4.2
- Mezcla (Wikipedia)