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