เริ่มต้นอาร์เรย์ของจำนวนเต็ม 1001 ด้วยค่า 0-1000 และตั้งค่าตัวแปร max เป็นดัชนีสูงสุดปัจจุบันของอาร์เรย์ (เริ่มต้นด้วย 1,000) เลือกตัวเลขสุ่ม r ระหว่าง 0 ถึงสูงสุดสลับหมายเลขที่ตำแหน่ง r ด้วยหมายเลขที่ตำแหน่งสูงสุดและส่งกลับหมายเลขตอนนี้ที่ตำแหน่งสูงสุด ลดสูงสุด 1 และดำเนินการต่อ เมื่อ max เป็น 0 ให้ตั้งค่า max กลับเป็นขนาดของ array - 1 แล้วเริ่มต้นใหม่อีกครั้งโดยไม่ต้องกำหนดค่าเริ่มต้นใหม่
อัปเดต:
แม้ว่าฉันจะใช้วิธีนี้ด้วยตัวเองเมื่อฉันตอบคำถามหลังจากการวิจัยบางอย่างฉันรู้ว่านี่เป็นรุ่นที่ได้รับการแก้ไขของFisher-Yatesหรือที่เรียกว่า Durstenfeld-Fisher-Yates หรือ Knuth-Fisher-Yates เนื่องจากคำอธิบายอาจเป็นเรื่องยากที่จะติดตามฉันได้ให้ตัวอย่างด้านล่าง (ใช้ 11 องค์ประกอบแทน 1001):
Array เริ่มต้นด้วยองค์ประกอบ 11 ค่าเริ่มต้นไปยังอาร์เรย์ [n] = n ค่าสูงสุดเริ่มต้นที่ 10:
+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|
+--+--+--+--+--+--+--+--+--+--+--+
^
max
ที่การวนซ้ำแต่ละครั้งสุ่มหมายเลข r ถูกเลือกระหว่าง 0 ถึงสูงสุดอาร์เรย์ [r] และอาร์เรย์ [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 ครั้งตัวเลขทั้งหมดในอาเรย์ได้ถูกเลือกสูงสุด == 0 และองค์ประกอบอาเรย์จะถูกสับ:
+--+--+--+--+--+--+--+--+--+--+--+
| 4|10| 8| 6| 2| 0| 9| 5| 1| 7| 3|
+--+--+--+--+--+--+--+--+--+--+--+
ณ จุดนี้สูงสุดสามารถรีเซ็ตเป็น 10 และกระบวนการสามารถดำเนินการต่อ