पर्ल 28/13 15 2.15
sub r{$s^=~($s^=$s/7215)<<8}
लॉग फ़ाइल यहाँ
पर्ल 29/13 23 2.23
sub r{$s^=~($s^=$s<<8)/60757}
लॉग फ़ाइल यहाँ
ये एक Xorshift पर भिन्नता के कुछ हैं , एक सही बदलाव के बजाय फ्लोटिंग पॉइंट डिवीजन का उपयोग करते हैं। वे दोनों 15 में से 13 टेस्ट पास करते हैं, केवल 6 और 7 टेस्ट में फेल होते हैं।
मुझे पूरा यकीन नहीं है कि चक्र कितना लंबा है, लेकिन क्योंकि निम्न कोड किसी भी समय की अवधि में समाप्त नहीं होता है, इसलिए यह संभव है कि पूर्ण 2 32 :
$start = r();
$i++ while $start != r();
print $i;
पर्ल 39/10 = 3.9
$s=$^T;sub r{~($s=$s*$s%4294969373)||r}
नोट: यदि आप ब्लम-ब्लम-शुब-एस्क पीआरएनजी की तलाश कर रहे हैं, तो कीथ रान्डेल का समाधान इन दोनों में से कहीं बेहतर है।
नीचे मेरे मूल समाधान के रूप में, यह ब्लम ब्लम शुब का एक कार्यान्वयन भी है, जिसमें एक बड़ा अंतर है। मैं 2 32 ( M = 50971 • 84263 ) की तुलना में थोड़ा बड़ा मापांक का उपयोग करता हूं , और जब भी कोई मूल्य सामने आता है कि यह वैध 32-बिट पूर्णांक नहीं है (जो कि 2 32 से बड़ा है ), तो यह अगला मान देता है इसके बजाय रोटेशन। एसेन्स में, इन मूल्यों को समाप्त कर दिया जाता है, बाकी के रोटेशन को अधूरा छोड़ दिया जाता है, जिसके परिणामस्वरूप लगभग एक समान वितरण होता है।
लगता है मदद की है। पहले की तरह ही 9 परीक्षणों को पारित करने के अलावा, यह अब न्यूनतम दूरी की परीक्षा में भी उत्तीर्ण होता है। एक नमूना लॉग फ़ाइल यहां पाई जा सकती है ।
पर्ल 33/9 67 3.67 (अमान्य?)
$s=$^T;sub r{$s=$s*$s%4294951589}
नोट: इस समाधान को अमान्य माना जा सकता है, क्योंकि सीमा का शीर्ष -तम 0.00037% कभी नहीं देखा जाएगा।
ब्लम ब्लम शुब का एक त्वरित और गंदा कार्यान्वयन । मैं निम्नलिखित परिणामों का दावा करता हूं:
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 के बहुत करीब होता है , जो कि विफलता का संकेत देता है।
विवरण
सामान्य तौर पर, ब्लम ब्लम शुब एक भयानक PRNG है, लेकिन यह एक अच्छा मापांक चुनकर प्रदर्शन में सुधार किया जा सकता है। जिस एम को मैंने चुना है वह 7027 • 611207 है । ये दोनों प्रमुख कारक, p और q , में मॉड्यूलर रेसिड्यू 3 (mod 4) , और gcd (φ (p-1), 1 (q-1) = 2 है , जो जितना हो सके उतना कम है।
हालाँकि ये विकि पृष्ठ पर सूचीबद्ध एकमात्र मानदंड हैं, लेकिन यह पर्याप्त प्रतीत नहीं होता है। लगभग सभी modulo मैंने कोशिश की हर परीक्षण में विफल रहा। लेकिन एक मुट्ठी भर है जो कुछ परीक्षणों को पारित करेगा, और जो मैंने चुना है वह असाधारण रूप से अच्छा लगता है, जो भी कारण हो।
अंतिम नोट के रूप में, टेस्ट 5 अपने आप में एक अच्छा संकेतक प्रतीत होता है कि PRNG कितना अच्छा है। यदि यह टेस्ट 5 को लगभग पास नहीं करता है , तो यह उनमें से बाकी को शानदार तरीके से विफल कर देगा।
बोनस: ६२ / १४ US ४.४३
$t=$^T;sub r{$t|=(($s=$s/2|$t%2<<31)^($t/=2))<<31for 1..37;$t}
बस गीकरी के लिए, यह एनईएस के लिए मूल टेट्रिस में उपयोग किए गए PRNG का 32-बिट संस्करण है। आश्चर्यजनक रूप से, यह 15 में से 14 परीक्षण पास करता है!
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