Perl 28/13 ≈ 2.15
sub r{$s^=~($s^=$s/7215)<<8}
ล็อกไฟล์ที่นี่
Perl 29/13 ≈ 2.23
sub r{$s^=~($s^=$s<<8)/60757}
ล็อกไฟล์ที่นี่
สิ่งเหล่านี้เป็นความแตกต่างของXorshiftโดยใช้การแบ่งจุดแบบลอยแทนการกะขวา พวกเขาทั้งสองผ่านการทดสอบ 13 จาก 15 การทดสอบที่ล้มเหลวเพียง 6 และ 7
ฉันไม่แน่ใจว่ารอบการทำงานนั้นนานแค่ไหน แต่เนื่องจากรหัสต่อไปนี้ไม่ได้สิ้นสุดลงในช่วงเวลาสั้น ๆ จึงเป็นไปได้ที่2 32เต็ม:
$start = r();
$i++ while $start != r();
print $i;
Perl 39/10 = 3.9
$s=$^T;sub r{~($s=$s*$s%4294969373)||r}
หมายเหตุ: หากคุณกำลังมองหา PRNG Blum-Blum-Shub-esque วิธีแก้ปัญหาของ Keith Randallดีกว่าสิ่งใดสิ่งหนึ่ง
เช่นเดียวกับโซลูชันดั้งเดิมของฉันด้านล่างนี่เป็นการนำ Blum Blum Shub มาใช้ซึ่งมีความแตกต่างที่สำคัญอย่างหนึ่ง ฉันใช้มอดุลัสที่มีขนาดใหญ่กว่า2 32เล็กน้อย( M = 50971 • 84263 ) และเมื่อใดก็ตามที่พบว่าค่านั้นไม่ใช่จำนวนเต็ม 32 บิตที่ถูกต้อง (นั่นคือมากกว่า2 32 ) จะส่งกลับค่าถัดไปใน หมุนแทน ในสาระสำคัญค่าเหล่านี้จะถูกตัดออกเหลือส่วนที่เหลือของการหมุนที่ไม่ถูกรบกวนส่งผลให้มีการกระจายเกือบสม่ำเสมอ
ดูเหมือนว่าจะช่วย นอกเหนือจากการผ่านการทดสอบ 9 ครั้งเหมือนเมื่อก่อนตอนนี้ก็ผ่านการทดสอบระยะทางขั้นต่ำอย่างน่าเชื่อถือ แฟ้มบันทึกตัวอย่างสามารถพบได้ที่นี่
Perl 33/9 ≈ 3.67 (ไม่ถูกต้อง?)
$s=$^T;sub r{$s=$s*$s%4294951589}
หมายเหตุ: การแก้ปัญหานี้อาจถือว่าไม่ถูกต้องเนื่องจาก 0.00037% สูงสุดของช่วงจะไม่ถูกสังเกต
การดำเนินรวดเร็วและสกปรกของบลัมบลัม Shub ฉันอ้างสิทธิ์ผลลัพธ์ต่อไปนี้:
1. passed - Birthday Spacings
2. FAILED - Overlapping Permutations
3. passed - Ranks of 31x31 and 32x32 Matrices
4. passed - Ranks of 6x8 Matrices
5. FAILED - Monkey Tests on 20-bit Words
6. FAILED - Monkey Tests OPSO, OQSO, DNA
7. FAILED - Count the 1s in a Stream of Bytes
8. passed - Count the 1s for Specific Bytes
9. passed - Parking Lot Test
10. FAILED - Minimum Distance Test
11. passed - Random Spheres Test
12. FAILED - The Squeeze Test
13. passed - Overlapping Sums Test
14. passed - Runs Test
15. passed - The Craps Test
ไฟล์บันทึกตัวอย่างสามารถพบได้ที่นี่อย่าลังเลที่จะโต้แย้งผลลัพธ์ใด ๆ ไฟล์สำหรับมิจฉาทิฐิสามารถสร้างในลักษณะดังต่อไปนี้:
print pack('N', r()) for 1..4194304
จากนั้นไพพ์เอาท์พุทเป็นไฟล์ ระยะทางขั้นต่ำดูเหมือนว่ามันจะผ่านไปแล้ว แต่ถ้าคุณวิ่งหลาย ๆ ครั้งมันจะอยู่ใกล้กับ1.0มากซึ่งบ่งบอกถึงความล้มเหลว
รายละเอียด
โดยทั่วไป Blum Blum Shub นั้นแย่มาก PRNG แต่ประสิทธิภาพนั้นสามารถปรับปรุงได้ด้วยการเลือกโมดูลัสที่ดี Mผมเคยได้รับการแต่งตั้งเป็น7027 • 611,207 ทั้งปัจจัยสำคัญเหล่านี้pและqมีสารตกค้างแบบแยกส่วน3 (mod 4)และgcd (φ (p-1), φ (q-1)) = 2ซึ่งต่ำที่สุดเท่าที่จะเป็นไปได้
แม้ว่าสิ่งเหล่านี้เป็นเพียงเกณฑ์ที่ระบุไว้ในหน้า wiki แต่ก็ดูเหมือนจะไม่เพียงพอ โมดูโล่เกือบทั้งหมดที่ฉันลองใช้นั้นล้มเหลวทุกการทดสอบ แต่มีไม่กี่คนที่จะผ่านการทดสอบบางอย่างและแบบทดสอบที่ฉันเลือกนั้นดูดีมากไม่ว่าด้วยเหตุผลใด
ในฐานะที่เป็นบันทึกสุดท้ายการทดสอบ 5 ด้วยตัวเองดูเหมือนว่าจะเป็นตัวบ่งชี้ที่ดีพอสมควรว่า PRNG นั้นดีเพียงใด ถ้ามันเกือบจะไม่ผ่านการทดสอบ 5 มันจะล้มเหลวในส่วนที่เหลือของพวกเขาอย่างน่าทึ่ง
โบนัส: Perl 62/14 ≈ 4.43
$t=$^T;sub r{$t|=(($s=$s/2|$t%2<<31)^($t/=2))<<31for 1..37;$t}
เพียงแค่ geekery นี่คือ PRNG รุ่น 32 บิตที่ใช้ใน Tetris ดั้งเดิมสำหรับ NES น่าประหลาดใจที่ผ่านการทดสอบ 14 จาก 15 ครั้ง!
1. passed - Birthday Spacings
2. passed - Overlapping Permutations
3. passed - Ranks of 31x31 and 32x32 Matrices
4. passed - Ranks for 6x8 Matrices
5. passed - Monkey Tests on 20-bit Words
6. passed - Monkey Tests OPSO, OQSO, DNA
7. FAILED - Count the 1s in a Stream of Bytes
8. passed - Count the 1s for Specific Bytes
9. passed - Parking Lot Test
10. passed - Minimum Distance Test
11. passed - Random Spheres Test
12. passed - The Squeeze Test
13. passed - Overlapping Sums Test
14. passed - Runs Test
15. passed - The Craps Test
ล็อกไฟล์ตัวอย่างสามารถก่อนที่นี่
เป็นที่ยอมรับ1..37
บิตไม่ใช่การถอดความที่แน่นอน ในเวอร์ชันปกติรูทีนเอนโทรปีจะได้รับการอัพเดต 60 ครั้งต่อวินาทีจากนั้นทำการสอบถามตามช่วงเวลาที่สุ่มขึ้นอยู่กับอินพุตของผู้ใช้เป็นหลัก 0xAB47
สำหรับทุกคนที่ใส่ใจที่จะถอดรอมประจำเอนโทรปีเริ่มต้นที่
งูหลามแบบหลอกรหัส:
carry = entropy_1 & 1
entropy_1 >>= 1
entropy_2 = (entropy_2 >> 1) | (carry << 31)
carry = (entropy_1 & 1) ^ (entropy_2 & 1)
entropy_1 |= carry << 31