Làm thế nào Python ngẫu nhiên shuffle hoạt động?


11

Làm thế nào shuffle từ ngẫu nhiên hoạt động trong Python?

Tôi hỏi vì nó hoạt động rất nhanh. Khi tôi cố gắng viết shuffle, nó hoạt động 1 phút cho 10 ^ 6 phần tử, nhưng Python shuffle có làm điều đó trong 8 giây không?


14
Tại sao không chỉ nhìn vào mã nguồn ?
lười

4
thuật toán xáo trộn tốt nhất là shuffle câu , nó chạy trong thời gian O (n) và được chứng minh là một shuffle hoàn hảo (giả sử nguồn ngẫu nhiên tốt)
ratchet freak

1
@ratchetfreak: Python sử dụng Fisher-Yates.
Martijn Pieters

1
Thuật toán của bạn cho shuffle là gì?
whatsisname

@sloth, nhân tiện, Raymond Hettinger đã đề xuất một thực tiễn phổ biến về các tài liệu liên kết trở lại mã nguồn vào năm 2011
Cristian Ciupitu

Câu trả lời:


17

Python random.shufflesử dụng shuffle Fisher-Yates , chạy trong thời gian O (n) và được chứng minh là một shuffle hoàn hảo (giả sử một trình tạo số ngẫu nhiên tốt).

Nó lặp lại mảng từ mục cuối cùng đến mục đầu tiên, chuyển đổi từng mục với một mục tại một chỉ mục ngẫu nhiên bên dưới nó.

Quá trình cơ bản của việc xáo trộn FisherTHER Yates tương tự như chọn ngẫu nhiên các vé được đánh số từ một chiếc mũ, hoặc các thẻ từ một cỗ bài, hết lần này đến lần khác cho đến khi không còn nữa. Những gì thuật toán cụ thể cung cấp là một cách thực hiện số này một cách hiệu quả và nghiêm ngặt, được thực hiện đúng cách, đảm bảo một kết quả không thiên vị ...

Giải pháp ... hiện đại là di chuyển các số "bị đánh" đến cuối danh sách bằng cách hoán đổi chúng với số chưa được rút cuối cùng ở mỗi lần lặp. Điều này làm giảm độ phức tạp thời gian của thuật toán xuống O (n), so với O (n 2 ) đối với việc triển khai ngây thơ. Thay đổi này đưa ra thuật toán sau (đối với mảng dựa trên zero).

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]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.