質問
重複の可能性:
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())
私はこの質問からジョンスキートのソリューションを追加しました私の拡張機能ライブラリへ。私は両方とも、外部の乱数発生器を取り、デフォルトの実装(ランダム)を使用して作成することをメソッドを実装します。
所属していません StackOverflow