このオンライン ツールの動作と同様に、StringList 内の文字列をランダム化するにはどうすればよいですか。誰かがそれに精通している場合は、これを確認してください: http://textmechanic.co/Randomize-List.html
質問する
4157 次
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で説明されています。
参考文献:
- フィッシャー-イェーツシャッフル(ウィキペディア)
- シャッフルに関するJeffAttwoodの2つのブログ記事:シャッフルとナイーブの危険
- フィッシャー-イェーツシャッフルの背後にある直感(Eli Bendersky)
- Art of Computer Programming、Donald Knuth、第2巻、セクション3.4.2
- シャッフル(ウィキペディア)
于 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
使用して比較子を作成し、それを使用して並べ替えます。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);
于 2012-12-22T20:21:41.507 に答える