重複の可能性:
C#でリスト<T>をランダム化する
オーディオファイルの場所への何千ものFilePathを含むリストがあり、リストを「シャッフル」する最も効率的な方法はどれでしょうか。
どんな助けでも大歓迎です:)
ありがとうございました
重複の可能性:
C#でリスト<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)を使用して、100万個のアイテムをそれぞれ1000回シャッフルすることで、小さなパフォーマンステストを行いました。これは、約15倍(!)高速です。
myList.OrderBy(Guid.NewGuid())
この質問のJonSkeetのソリューションを拡張機能ライブラリに追加しました。外部の乱数ジェネレーターを使用し、デフォルトの実装(Random)を使用して生成するメソッドを実装しました。