How can I randomize the Strings in the StringList similarly how this online tool works. If anyone is familiar with it, check this: http://textmechanic.co/Randomize-List.html
Just loop through the stringlist and give each item an different random place:
for i := StringList.Count - 1 downto 1 do
StringList.Exchange(i, Random(i+1));
[edit] Altered the loop a bit to make the shuffling uniform.
One common algorithm to perform a shuffle is the Fisher-Yates shuffle. This generates uniformly distributed permutations.
To implement on a Delphi TStrings
object you can use this:
procedure Shuffle(Strings: TStrings);
var
i: Integer;
begin
for i := Strings.Count-1 downto 1 do
Strings.Exchange(i, Random(i+1));
end;
Now, whilst in theory this will generate uniformly distributed permutations, the actual performance depends heavily on the quality of the random number generator. This is discussed in Knuth's Art of Computer Programming, volume 2, section 3.4.2, Algorithm P.
Further reading:
To randomize a TStrings
, create a comparer from TComparer
with random result value, and sort the TStrings
with it.
/// 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;
or to call directly:
/// Shuffle
MyString.Sort(TMyShuffleComparer.Create);