Подтвердить что ты не робот

Рандомизировать StringList

Как я могу случайным образом группировать строки в StringList так же, как работает этот онлайн-инструмент. Если кто-то знаком с этим, проверьте это: http://textmechanic.co/Randomize-List.html

4b9b3361

Ответ 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.

Дальнейшее чтение:

Ответ 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);