随机化StringList

San*_*ira 13 delphi delphi-xe2

我如何随机化StringList中的字符串,类似于此在线工具的工作原理.如果有人熟悉它,请检查:http://textmechanic.co/Randomize-List.html

Dav*_*nan 21

执行混洗的一种常见算法是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;
Run Code Online (Sandbox Code Playgroud)

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

进一步阅读:

  • @Rob回应了吗?而且我不明白为什么你会对那些尽可能做事的人采取讽刺的语气,并帮助你一路走来. (5认同)
  • 一点也不.Golez的代码是偏斜的.选择一些排列的概率高于其他排列.我怀疑你不想那样. (2认同)

Gol*_*rol 5

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

for i := StringList.Count - 1 downto 1 do
  StringList.Exchange(i, Random(i+1));
Run Code Online (Sandbox Code Playgroud)

[编辑] 稍微改变循环以使洗牌统一。

  • 这个答案演示了维基百科中讨论的费舍尔-耶茨错误之一,在[“实现错误”](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Implementation_errors)部分。尽管它仍然会产生打乱的结果(这是所要求的所有问题),但它不是统一的打乱算法。RNG 的质量与这个问题是正交的。 (2认同)