xe2 versiones full embarcadero edition community borland delphi delphi-xe2

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: