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?
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?
Jawaban:
Python random.shuffle
menggunakan 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]