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?
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?
Câu trả lời:
Python random.shuffle
sử 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]