Ініціалізуйте масив з 1001 цілих чисел зі значеннями 0-1000 і встановіть змінну, max, на поточний максимальний індекс масиву (починаючи з 1000). Виберіть випадкове число, r, між 0 і max, поміняйте номер у позиції r на число в положенні max і поверніть це число в позицію max. Зменшення макс на 1 і продовжуйте. Коли max дорівнює 0, встановіть max назад на розмір масиву - 1 і почніть знову, не потребуючи повторної ініціалізації масиву.
Оновлення:
Хоча я сам придумав цей метод, коли відповів на це питання, але після деяких досліджень я розумію, що це модифікована версія Фішера-Йейта, відома як Дурстенфельд-Фішер-Йейтс або Кнут-Фішер-Йейтс. Оскільки опису може бути трохи важко дотримуватися, я наводив приклад нижче (використовуючи 11 елементів замість 1001):
Масив починається з 11 елементів, ініціалізованих до масиву [n] = n, макс починається з 10:
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|
+--+--+--+--+--+--+--+--+--+--+--+
^
max
При кожній ітерації вибирається випадкове число r між 0 і max, масив [r] і масив [max] підміняються, новий масив [max] повертається і макс зменшується:
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|
+--+--+--+--+--+--+--+--+--+--+--+
...
Після 11 ітерацій всі масиви в масиві були обрані, max == 0, і елементи масиву перетасовуються:
+--+--+--+--+--+--+--+--+--+--+--+
| 4|10| 8| 6| 2| 0| 9| 5| 1| 7| 3|
+--+--+--+--+--+--+--+--+--+--+--+
У цей момент максимум можна скинути до 10, і процес може тривати.