Khởi tạo một mảng gồm 1001 số nguyên với các giá trị 0-1000 và đặt một biến, max, thành chỉ mục tối đa hiện tại của mảng (bắt đầu bằng 1000). Chọn một số ngẫu nhiên, r, từ 0 đến tối đa, hoán đổi số tại vị trí r với số ở vị trí tối đa và trả về số ngay tại vị trí tối đa. Giảm tối đa 1 và tiếp tục. Khi max là 0, đặt max trở lại kích thước của mảng - 1 và bắt đầu lại mà không cần phải xác định lại mảng.
Cập nhật:
Mặc dù tôi đã tự mình nghĩ ra phương pháp này khi trả lời câu hỏi, sau một số nghiên cứu tôi nhận ra đây là phiên bản sửa đổi của Fisher-Yates tên là Durstenfeld-Fisher-Yates hoặc Knuth-Fisher-Yates. Vì mô tả có thể hơi khó theo dõi, tôi đã cung cấp một ví dụ bên dưới (sử dụng 11 yếu tố thay vì 1001):
Mảng bắt đầu với 11 phần tử được khởi tạo thành mảng [n] = n, max bắt đầu lúc 10:
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|
+--+--+--+--+--+--+--+--+--+--+--+
^
max
Ở mỗi lần lặp, một số ngẫu nhiên r được chọn giữa 0 và max, mảng [r] và mảng [max] được hoán đổi, mảng mới [max] được trả về và max bị giảm:
max = 10, r = 3
+--------------------+
v v
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2|10| 4| 5| 6| 7| 8| 9| 3|
+--+--+--+--+--+--+--+--+--+--+--+
max = 9, r = 7
+-----+
v v
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2|10| 4| 5| 6| 9| 8| 7: 3|
+--+--+--+--+--+--+--+--+--+--+--+
max = 8, r = 1
+--------------------+
v v
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 8| 2|10| 4| 5| 6| 9| 1: 7| 3|
+--+--+--+--+--+--+--+--+--+--+--+
max = 7, r = 5
+-----+
v v
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 8| 2|10| 4| 9| 6| 5: 1| 7| 3|
+--+--+--+--+--+--+--+--+--+--+--+
...
Sau 11 lần lặp, tất cả các số trong mảng đã được chọn, max == 0 và các phần tử mảng được xáo trộn:
+--+--+--+--+--+--+--+--+--+--+--+
| 4|10| 8| 6| 2| 0| 9| 5| 1| 7| 3|
+--+--+--+--+--+--+--+--+--+--+--+
Tại thời điểm này, tối đa có thể được đặt lại thành 10 và quá trình có thể tiếp tục.