Fisher-Yates シャッフル アルゴリズム: 線形時間シャッフル アルゴリズム
整数のリストをランダムに並べ替える場合、効率が非常に重要です。質問の元の方法ではランダム性を達成しようとしていますが、処理中、特に最後近くで効率の問題が発生する可能性があります。
より効率的なソリューションは、入力リストの真にランダムな並べ替えを保証する線形時間アルゴリズムであるフィッシャー・イェーツ シャッフル アルゴリズムです。交換された要素を追跡するためにブール配列に依存した元のアプローチとは異なり、フィッシャー・イェーツのシャッフル アルゴリズムはより単純なアプローチを採用しています。
<code class="language-c#">for (int i = iItemCount - 1; i >= 1; i--) { int j = random.Next(i + 1); int temp = values[j]; values[j] = values[i]; values[i] = temp; }</code>
このアルゴリズムは、現在の要素を、リスト内で以前にランダムに選択された要素と繰り返し交換することによって機能します。アルゴリズムが進むにつれて、ソートされていない要素の範囲が狭まり、リスト全体が O(n) 時間で効果的にシャッフルされます。
フィッシャー・イェーツのシャッフル アルゴリズムを使用すると、元のアルゴリズムの潜在的な落とし穴を回避しながら、整数のリストを効率的かつランダムに並べ替えることができます。
以上がフィッシャー・イェーツ・シャッフルはどのようにして線形時間ランダム・シャッフルを実現できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。