14

我怎样才能像这个在线工具的工作方式一样随机化 StringList 中的字符串。如果有人熟悉它,请检查:http ://textmechanic.co/Randomize-List.html

4

3 回答 3

25

执行 shuffle 的一种常见算法是Fisher-Yates shuffle。这会产生均匀分布的排列。

要在 DelphiTStrings对象上实现,您可以使用以下命令:

procedure Shuffle(Strings: TStrings);
var
  i: Integer;
begin
  for i := Strings.Count-1 downto 1 do 
    Strings.Exchange(i, Random(i+1));
end;

现在,虽然理论上这将产生均匀分布的排列,但实际性能在很大程度上取决于随机数生成器的质量。这在 Knuth 的计算机编程艺术,第 2 卷,第 3.4.2 节,算法 P 中进行了讨论。

进一步阅读:

于 2012-12-22T21:44:41.857 回答
4

只需遍历字符串列表并给每个项目一个不同的随机位置:

for i := StringList.Count - 1 downto 1 do
  StringList.Exchange(i, Random(i+1));

[编辑] 稍微改变了循环以使洗牌均匀。

于 2012-12-22T20:37:38.443 回答
-3

要随机化 a ,请使用随机结果值TStrings创建一个比较器,并用它对 进行排序。TComparerTStrings

/// 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);
于 2012-12-22T20:21:41.507 回答