0-1000 değerleriyle 1001 tamsayılar dizisini başlatın ve dizinin geçerli maksimum dizinine (1000 ile başlayan) bir değişken max ayarlayın. Rasgele bir sayı seçin, r, 0 ile maks. Arasında, r konumundaki sayıyı max konumundaki sayıyla değiştirin ve şimdi sayıyı max konumunda döndürün. Maks. 1 azaltın ve devam edin. Max 0 olduğunda, max değerini dizinin boyutuna geri getirin - 1 ve diziyi yeniden başlatmaya gerek kalmadan yeniden başlayın.
Güncelleme:
Soruyu cevaplarken bu yöntemi kendi başıma bulsam da , bazı araştırmalardan sonra bunun Durstenfeld-Fisher-Yates veya Knuth-Fisher-Yates olarak bilinen Fisher-Yates'in değiştirilmiş bir versiyonu olduğunu fark ettim . Açıklamayı takip etmek biraz zor olabileceğinden, aşağıda bir örnek verdim (1001 yerine 11 eleman kullanarak):
Dizi, [n] = n dizisine başlatılan 11 öğeyle başlar, maks. 10'da başlar:
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|
+--+--+--+--+--+--+--+--+--+--+--+
^
max
Her yinelemede, 0 ile max arasında rastgele bir r sayısı seçilir, dizi [r] ve dizi [max] değiştirilir, yeni dizi [max] döndürülür ve max azaltılır:
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 yinelemeden sonra dizideki tüm sayılar seçildi, max == 0 ve dizi öğeleri karıştırıldı:
+--+--+--+--+--+--+--+--+--+--+--+
| 4|10| 8| 6| 2| 0| 9| 5| 1| 7| 3|
+--+--+--+--+--+--+--+--+--+--+--+
Bu noktada, maks 10'a sıfırlanabilir ve işlem devam edebilir.