随机化StringList

时间:2012-12-22 20:10:57

标签: delphi delphi-xe2

我如何将StringList中的字符串随机化,这与在线工具的工作方式类似。如果有人熟悉它,请查看:http://textmechanic.co/Randomize-List.html

3 个答案:

答案 0 :(得分:20)

执行shuffle的一种常见算法是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的计算机程序设计,第2卷,第3.4.2节,算法P。

中讨论

进一步阅读:

答案 1 :(得分:4)

只需循环遍历字符串列表,并为每个项目提供不同的随机位置:

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

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

答案 2 :(得分:-3)

要随机化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);