Как я могу случайным образом группировать строки в StringList так же, как работает этот онлайн-инструмент. Если кто-то знаком с этим, проверьте это: http://textmechanic.co/Randomize-List.html
Рандомизировать StringList
Ответ 1
Один общий алгоритм для выполнения тасования - это Fisher-Yates shuffle. Это порождает равномерно распределенные перестановки.
Для реализации на объекте Delphi TStrings
вы можете использовать это:
procedure Shuffle(Strings: TStrings);
var
i: Integer;
begin
for i := Strings.Count-1 downto 1 do
Strings.Exchange(i, Random(i+1));
end;
Теперь, хотя теоретически это порождает равномерно распределенные перестановки, фактическая производительность сильно зависит от качества генератора случайных чисел. Это обсуждается в Knuth Art of Computer Programming, том 2, раздел 3.4.2, Алгоритм P.
Дальнейшее чтение:
- Fisher-Yates shuffle (Википедия)
- Jeff Attwood: две статьи блога о перетасовке: Shuffling и Опасность Наивета
- Интуиция за перетасовкой Фишера-Йейта (Эли Бендерски)
- Искусство компьютерного программирования, Дональд Кнут, том 2, раздел 3.4.2
- Shuffling (Википедия)
Ответ 2
Просто пропустите строковый список и дайте каждому элементу другое случайное место:
for i := StringList.Count - 1 downto 1 do
StringList.Exchange(i, Random(i+1));
[править] Несколько изменил петлю, чтобы сделать равномерную перетасовку.
Ответ 3
Чтобы рандомизировать a TStrings
, создайте сравнитель из TComparer
со значением случайного результата и соберите TStrings
с ним.
/// 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;
или для прямого вызова:
/// Shuffle
MyString.Sort(TMyShuffleComparer.Create);