เริ่มต้นด้วยอาร์เรย์ของดัชนีที่เรียงลำดับ
เดอะ เดอร์สเทนเฟลด์ ชัฟเฟิล ทำงานโดยดำเนินการผ่านอาร์เรย์ โดยถือว่าส่วนหนึ่งของอาร์เรย์เป็นแบบสับ และส่วนที่เหลือของอาร์เรย์เป็นแบบไม่สับ เพียงแค่สลับรายการแต่ละรายการในอาร์เรย์ด้วยรายการสุ่มจากพื้นที่ที่ไม่ได้สับจนกว่าอาร์เรย์จะสับจนสมบูรณ์
การเรียงสับเปลี่ยนทั้งหมดจะเท่าเทียมกัน
CSPRNG เชิงกำหนด (ระบุด้วยหมายเลขที่คุณป้อน) จะใช้เพื่อสร้างดัชนีสุ่มที่เลือกระหว่างการสุ่ม
const csprng = new csprng(<input number seed>);
เลนส์ const = 10;
const a = อาร์เรย์ใหม่ (เลนส์);
สำหรับ (ให้ i=0; i<len; i++) a[i] = i;
สำหรับ (ให้ i=0; i<len; i++) {
ให้ swapIndex = nextDeterministicallyRandomIntBetween(i, len, csprng);
ให้ tmp = a[i]; ก[i] = ก[swapIndex]; a[swapIndex] = tmp; // แลกเปลี่ยน
}
ฟังก์ชัน nextDeterministicallyRandomIntBetween(lowerBoundInclusive
upperBoundExclusive, csprng) {
คืนค่า lowerBoundInclusive +
nextDeterministicallyRandomIntLowerThan(upperBoundExclusive-lowerBoundInclusive, csprng);
}
ฟังก์ชัน nextDeterministicallyRandomIntLowerThan (upperBoundExclusive, csprng) {
// กำหนดจำนวนขั้นต่ำของบิต "b" ที่จำเป็นในการแสดง
// (upperBoundExclusive-1). จากนั้นถาม csprng ซ้ำๆ สำหรับ b บิต
// จนกว่าจะส่งกลับผลลัพธ์ที่ต่ำกว่า upperBoundExclusive
ให้ b = Math.ceil(Math.log(upperBoundExclusive) / Math.log(2));
ให้ r;
ทำ {
r = csprng.nextBits(ข);
} ในขณะที่ (r>=upperBoundExclusive);
กลับ r;
}