web-dev-qa-db-ja.com

Pythonランダムシャッフルはどのように機能しますか?

Pythonでランダムからのシャッフルはどのように機能しますか?

とても速いのでお願いします。シャッフルを書こうとすると、10 ^ 6要素で1分動作しますが、Pythonシャッフルは8秒で完了しますか?

11

Pythonの random.shuffleFisher-Yates shuffle を使用します。これはO(n)時間で実行され、完全なシャッフルであることが証明されています(適切な乱数を想定)発生器)。

配列を最後のエントリから最初のエントリまで繰り返し、各エントリをその下のランダムなインデックスにあるエントリに切り替えます。

フィッシャー・イェーツのシャッフルの基本的なプロセスは、帽子から番号の付いたチケット、またはデッキからカードをランダムに選ぶことと似ています。特定のアルゴリズムが提供するのは、これを効率的かつ厳密な方法で数値的に行う方法であり、適切に行われると、公平な結果が保証されます...

現代の...解決策は、「繰り返し」数をリストの最後に移動することです。これは、各反復で最後の「未確認」番号と入れ替えることによって行います。これにより、アルゴリズムの時間の複雑さがO(n)に比べてO(n)に減少します。2)素朴な実装の場合。この変更により、次のアルゴリズムが得られます(ゼロベースの配列の場合)。

To shuffle an array a of n elements (indices 0..n-1):
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]
17
Robert Harvey