Pythonランダムシャッフルの仕組み


11

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

それは非常に速く動作するので私は尋ねます。シャッフルを書き込もうとすると、10 ^ 6要素で1分動作しますが、Pythonシャッフルは8秒で動作しますか?


14
なぜソースコードだけを見ないのですか?
ナマケモノ2013年

4
最高のシャッフルアルゴリズムはfisher-yatesシャッフルで、O(n)時間で実行され、完全なシャッフルであることが証明されています(良いランダムソースを想定)
ラチェットフリーク

1
@ratchetfreak:Pythonは、Fisher-Yatesを使用しています。
Martijn Pieters 2013年

1
シャッフルのアルゴリズムは何ですか?
whatsisname 2013年

@sloth、ところで、レイモンドヘッティンガーは、提案されたソースコードへのバックリンクのドキュメントの普遍的な実践 2011年に戻って
クリスティアンCiupituを

回答:


17

Python は、O(n)時間で実行され、完全なシャッフルであることが証明されてrandom.shuffleいるFisher-Yatesシャッフルを使用します(優れた乱数ジェネレーターを想定)。

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

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

現代の...解決策は、各繰り返しで「打たれた」数値を最後の打たなかった数値と交換することによって、リストの最後に移動することです。これにより、単純な実装のO(n 2)と比較して、アルゴリズムの時間の複雑さがO(n)に削減されます。この変更により、次のアルゴリズムが得られます(ゼロベースの配列の場合)。

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]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.