質問

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

オーディオ ファイルの場所への何千もの FilePath が含まれるリストがあるのですが、リストを「シャッフル」する最も効率的な方法はどれだろうと考えていました。

助けていただければ幸いです:)

ありがとう

役に立ちましたか?

解決

フィッシャーイエーツシャッフルのか、また、クヌースシャッフルとして知られています。

他のヒント

:フィッシャーイエーツ/クヌースのシャッフルの

ここでは簡単なのです(まだ効果的な)実装

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)を使用して、千回、それぞれをシャッフルすることにより、小型の性能試験を行い、これは約15倍(!)高速です。

myList.OrderBy(Guid.NewGuid())

私はこの質問からジョンスキートのソリューションを追加しました私の拡張機能ライブラリへ。私は両方とも、外部の乱数発生器を取り、デフォルトの実装(ランダム)を使用して作成することをメソッドを実装します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top