Inizializza un array di 1001 numeri interi con i valori 0-1000 e imposta una variabile, max, sull'indice max corrente dell'array (a partire da 1000). Scegli un numero casuale, r, tra 0 e max, scambia il numero nella posizione r con il numero nella posizione max e restituisci il numero ora nella posizione max. Diminuisci max di 1 e continua. Quando max è 0, reimpostare max alla dimensione dell'array - 1 e ricominciare senza la necessità di reinizializzare l'array.
Aggiornamento:
Anche se ho trovato questo metodo da solo quando ho risposto alla domanda, dopo alcune ricerche mi rendo conto che questa è una versione modificata di Fisher-Yates nota come Durstenfeld-Fisher-Yates o Knuth-Fisher-Yates. Poiché la descrizione può essere un po 'difficile da seguire, ho fornito un esempio di seguito (utilizzando 11 elementi anziché 1001):
L'array inizia con 11 elementi inizializzati nell'array [n] = n, il massimo inizia a 10:
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|
+--+--+--+--+--+--+--+--+--+--+--+
^
max
Ad ogni iterazione, viene selezionato un numero casuale r tra 0 e max, l'array [r] e l'array [max] vengono scambiati, il nuovo array [max] viene restituito e il max viene diminuito:
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|
+--+--+--+--+--+--+--+--+--+--+--+
...
Dopo 11 iterazioni, tutti i numeri nell'array sono stati selezionati, max == 0 e gli elementi dell'array vengono mescolati:
+--+--+--+--+--+--+--+--+--+--+--+
| 4|10| 8| 6| 2| 0| 9| 5| 1| 7| 3|
+--+--+--+--+--+--+--+--+--+--+--+
A questo punto, max può essere resettato a 10 e il processo può continuare.