リストシャッフル:効果的かどうか?
一部のプログラマーはを使用してリストをシャッフルしますが、これは最良のアプローチですか?そのメカニズムと効率を調べましょう。OrderBy(x => r.Next())
OrderBy(x => r.Next())
パフォーマンスの問題
主要な欠点はパフォーマンスです。
メソッドにはO(n log n)の時間複雑さがあり、より大きなリストの他のO(n)シャッフルアルゴリズムよりも大幅に遅くなります。より良い解決策:フィッシャーイエートシャッフル
はるかに効率的な代替品は、スワッピングアルゴリズムを使用するFisher-Yates Shuffle(具体的にはDurstenfeldのバリアント)です。 この例は、このアプローチを使用した再利用可能なOrderBy
メソッドを示しています:
この改善されたバージョンは、シャッフルするにつれて要素を生成し、メモリの使用と処理を最適化します。
Shuffle
<code class="language-csharp">public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng) { T[] elements = source.ToArray(); for (int i = elements.Length - 1; i >= 0; i--) { int swapIndex = rng.Next(i + 1); yield return elements[swapIndex]; elements[swapIndex] = elements[i]; } }</code>
クラス:
で作業するときは、これらのポイントを覚えておいてください
複数のRandom
インスタンスを迅速に作成すると、同様の乱数シーケンスにつながる可能性があります。
Random
以上が`orderby(x => r.next())`リストをシャッフルする効果的な方法ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。