14

このオンライン ツールの動作と同様に、StringList 内の文字列をランダム化するにはどうすればよいですか。誰かがそれに精通している場合は、これを確認してください: http://textmechanic.co/Randomize-List.html

4

3 に答える 3

25

シャッフルを実行するための一般的なアルゴリズムの1つは、フィッシャー-イェーツシャッフルです。これにより、均一に分散された順列が生成されます。

DelphiTStringsオブジェクトに実装するには、次を使用できます。

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

現在、理論的にはこれにより均一に分散された順列が生成されますが、実際のパフォーマンスは乱数ジェネレーターの品質に大きく依存します。これについては、クヌースのコンピュータプログラミングの芸術、第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

をランダム化するには、ランダムな結果値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 に答える