Ответ 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 (Википедия)