17

重複の可能性:
C#でリスト<T>をランダム化する

オーディオファイルの場所への何千ものFilePathを含むリストがあり、リストを「シャッフル」する最も効率的な方法はどれでしょうか。

どんな助けでも大歓迎です:)

ありがとうございました

4

4 に答える 4

13

フィッシャー-イェーツシャッフル、またはクヌースシャッフルとも呼ばれます。

于 2010-02-20T04:17:43.623 に答える
8

フィッシャー-イェーツ/クヌースシャッフルの単純な(まだ効果的な)実装は次のとおりです。

Random rnd = new Random();
for (int i = files.Length; i > 1; i--) {
  int pos = rnd.Next(i);
  var x = files[i - 1];
  files[i - 1] = files[pos];
  files[pos] = x;
}

またはわずかなバリエーション:

Random rnd = new Random();
for (int i = 1; i < files.Length; i++) {
  int pos = rnd.Next(i + 1);
  var x = files[i];
  files[i] = files[pos];
  files[pos] = x;
}

これはO(n)演算であるため、リストをシャッフルする最も効率的な方法です。リスト内のすべてのアイテムを移動する必要があるため、O(n)よりも効率的にリストをシャッフルすることはできません。

このメソッドと現在受け入れられている回答(LINQ OrderBy)を使用して、100万個のアイテムをそれぞれ1000回シャッフルすることで、小さなパフォーマンステストを行いました。これは、約15倍(!)高速です。

于 2010-02-20T04:49:56.943 に答える
5

myList.OrderBy(Guid.NewGuid())

于 2010-02-20T04:21:54.140 に答える
0

この質問のJonSkeetのソリューションを拡張機能ライブラリに追加しました。外部の乱数ジェネレーターを使用し、デフォルトの実装(Random)を使用して生成するメソッドを実装しました。

于 2010-02-20T04:55:21.417 に答える