Bagaimana cara acak Python bekerja?


11

Bagaimana shuffle dari acak bekerja di Python?

Saya bertanya karena ini bekerja sangat cepat. Ketika saya mencoba untuk menulis shuffle bekerja 1 menit selama 10 ^ 6 elemen, tetapi Python shuffle melakukannya dalam 8 detik?


14
Mengapa tidak melihat kode sumber saja ?
sloth

4
algoritma shuffle terbaik adalah shuffle fisher-yates , ini berjalan dalam waktu O (n) dan terbukti menjadi shuffle sempurna (dengan asumsi sumber acak yang baik)
ratchet freak

1
@ratchetfreak: Python menggunakan Fisher-Yates.
Martijn Pieters

1
Apa algoritma Anda untuk shuffle?
whatsisname

@sloth, omong-omong, Raymond Hettinger mengusulkan praktik universal dokumen yang menghubungkan kembali ke kode sumber pada tahun 2011.
Cristian Ciupitu

Jawaban:


17

Python random.shufflemenggunakan shuffle Fisher-Yates , yang beroperasi dalam waktu O (n) dan terbukti menjadi shuffle sempurna (dengan asumsi generator nomor acak yang baik).

Itu iterates array dari yang terakhir ke entri pertama, beralih setiap entri dengan entri pada indeks acak di bawahnya.

Proses dasar pengocokan Fisher-Yates mirip dengan mengambil tiket bernomor secara acak dari topi, atau kartu dari geladak, satu demi satu hingga tidak ada lagi yang tersisa. Apa yang disediakan algoritma spesifik adalah cara melakukan hal ini secara numerik dengan cara yang efisien dan ketat yang, dilakukan dengan benar, menjamin hasil yang tidak bias ...

Solusi ... modern adalah memindahkan angka "yang dipukul" ke akhir daftar dengan menukar nomor tersebut dengan nomor yang terakhir kali dihentangkan pada setiap iterasi. Ini mengurangi kompleksitas waktu algoritma menjadi O (n), dibandingkan dengan O (n 2 ) untuk implementasi naif. Perubahan ini memberikan algoritma berikut (untuk array berbasis nol).

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]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.