পার্ল 28/13 ≈ 2.15
sub r{$s^=~($s^=$s/7215)<<8}
লগ ফাইল এখানে
পার্ল 29/13 ≈ 2.23
sub r{$s^=~($s^=$s<<8)/60757}
লগ ফাইল এখানে
এগুলি কোনও ডান শিফটের পরিবর্তে ভাসমান পয়েন্ট বিভাগ ব্যবহার করে একটি জর্শিফ্টে পরিবর্তনের কিছু। তারা উভয়ই 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 ( এম = 50971 • 84263 ), এবং যখনই একটি মান সম্মুখীন হয় যে একটি বৈধ 32 বিট পূর্ণসংখ্যা (যেমন, অধিক মাপের নয় 2 32 ), পরবর্তী মান ফেরৎ পরিবর্তে ঘূর্ণন। মূলত, এই মানগুলি ছাঁটাই করা হয়, বাকি আবর্তকে অব্যাহতভাবে ফেলে রাখা হয়, ফলস্বরূপ প্রায় অভিন্ন বন্টন ঘটে।
মনে হয় এটি সাহায্য করেছে। আগের মতো একই 9 টি পরীক্ষায় উত্তীর্ণ হওয়ার সাথে সাথে, এটি এখন দৃ .়তার সাথে ন্যূনতম দূরত্ব পরীক্ষায়ও পাস করে। একটি নমুনা লগ ফাইল এখানে পাওয়া যাবে ।
পার্ল 33/9 ≈ 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 এর খুব কাছাকাছি থাকে যা ব্যর্থতা নির্দেশ করে।
বিস্তারিত
সাধারণভাবে, ব্লাম ব্লাম শাব একটি ভয়াবহ পিআরএনজি, তবে এটির কার্যকারিতা একটি ভাল মডুলাস চয়ন করে উন্নত করা যেতে পারে। আমি যে এম নির্বাচন করেছি তা হ'ল 7027 • 611207 । এই উভয় মৌলিক উপাদান, পি এবং কিউ , মডুলার অবশিষ্টাংশ 3 (মোড 4) , এবং গিসিডি (φ (পি -1), φ (কিউ -1)) = 2 রয়েছে যা এটি যত কম হতে পারে তত কম।
যদিও এইগুলি উইকির পৃষ্ঠায় তালিকাভুক্ত একমাত্র মানদণ্ড, এটি যথেষ্ট বলে মনে হয় না। আমি যে সকল মডুলোর চেষ্টা করেছি সেগুলির প্রায় প্রতিটি পরীক্ষায় ব্যর্থ। তবে হাতেগোনা কিছু পরীক্ষা পাস করবে এবং আমি যেটি বেছে নিয়েছি তা যে কোনও কারণেই হোক না কেন ব্যতিক্রমীভাবে ভাল বলে মনে হচ্ছে।
চূড়ান্ত নোট হিসাবে, টেস্ট 5 তার নিজের থেকে মনে হয় PRNG কতটা ভাল তার একটি মোটামুটি ভাল সূচক। এটি যদি টেস্ট 5 প্রায় পাস না করে , তবে এটি বাকীগুলিকে দর্শনীয়ভাবে ব্যর্থ করবে।
বোনাস: পার্ল 62/14 ≈ 4.43
$t=$^T;sub r{$t|=(($s=$s/2|$t%2<<31)^($t/=2))<<31for 1..37;$t}
কেবল গীকারি করার জন্য, এটি পিএসএনজি-র একটি 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
বিট একটি সঠিক প্রতিলিপি নয় trans অরজিনাল সংস্করণে, এনট্রপি রুটিন প্রতি সেকেন্ডে 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