Zainicjuj tablicę 1001 liczb całkowitych o wartościach od 0 do 1000 i ustaw zmienną max na bieżący maksymalny indeks tablicy (zaczynając od 1000). Wybierz losową liczbę, r, od 0 do max, zamień liczbę na pozycji r liczbą na pozycji max i zwróć liczbę na pozycji max. Zmniejsz maksymalnie o 1 i kontynuuj. Gdy max wynosi 0, ustaw max z powrotem na rozmiar tablicy - 1 i zacznij od nowa bez potrzeby ponownej inicjalizacji tablicy.
Aktualizacja:
Chociaż wymyśliłem tę metodę samodzielnie, kiedy odpowiedziałem na pytanie, po kilku badaniach zdaję sobie sprawę, że jest to zmodyfikowana wersja Fisher-Yatesa znana jako Durstenfeld-Fisher-Yates lub Knuth-Fisher-Yates. Ponieważ opis może być trochę trudny do zrozumienia, poniżej podałem przykład (używając 11 elementów zamiast 1001):
Tablica zaczyna się od 11 elementów zainicjowanych w tablicy [n] = n, max zaczyna się od 10:
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|
+--+--+--+--+--+--+--+--+--+--+--+
^
max
Przy każdej iteracji wybierana jest losowa liczba r z zakresu od 0 do max, tablica [r] i tablica [max] są zamieniane, zwracana jest nowa tablica [max], a wartość max jest zmniejszana:
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|
+--+--+--+--+--+--+--+--+--+--+--+
...
Po 11 iteracjach wszystkie liczby w tablicy zostały wybrane, max == 0, a elementy tablicy są tasowane:
+--+--+--+--+--+--+--+--+--+--+--+
| 4|10| 8| 6| 2| 0| 9| 5| 1| 7| 3|
+--+--+--+--+--+--+--+--+--+--+--+
W tym momencie max można zresetować do 10 i proces może być kontynuowany.