एक यादृच्छिक संख्या जनरेटर के लिए मानव एंट्रोपी

यह केवल हमारी कमजोरी के कारण है, क्योंकि हमारी अज्ञानता हमारे लिए मौका है

क। इशारा

जितने अधिक लोगों ने ब्रह्मांड के रहस्यों को समझा, उतना ही वे अज्ञानता के बिंदु पर आए, जिस पर उनके पूर्वजों ने सब कुछ देवताओं के लिए जिम्मेदार ठहराया। अब इसे मौका कहा जाता है। और यद्यपि आइंस्टीन को विश्वास में नहीं आया - उन्होंने कहा कि "भगवान पासा नहीं खेलते हैं" - वह सूची में पहले से हैं: आइंस्टीन, श्रोडिंगर, लाप्लास ...

हमारे डिजिटल प्रौद्योगिकी के युग में और मानव जाति के विकास में सूचना की भारी भूमिका, सूचना संरक्षण एक आवश्यक कार्य है। इस समस्या के तकनीकी समाधान में "यादृच्छिकता" का आकर्षण शामिल है, अर्थात्, यादृच्छिक संख्याओं की पीढ़ी। इसके अलावा, परिणामों की गुणवत्ता सीधे इस्तेमाल किए गए जनरेटर की गुणवत्ता पर निर्भर करती है। यह परिस्थिति ओआरएनएल से रॉबर्ट आर। कैविएर की प्रसिद्ध कामोत्तेजना पर जोर देती है: "यादृच्छिक संख्या की पीढ़ी इसे मौका देने के लिए छोड़ना बहुत महत्वपूर्ण है।"

वास्तविक यादृच्छिक संख्याओं के स्रोत, उदाहरण के लिए, शारीरिक शोर - विकिरण घटना डिटेक्टरों, एक रोकनेवाला, ब्रह्मांडीय विकिरण, आदि में शोर को गोली मारते हैं। - शायद ही कभी सुरक्षा अनुप्रयोगों में उपयोग किया जाता है। एक वैकल्पिक समाधान बड़ी संख्या में यादृच्छिक संख्याओं के कुछ सेट बनाना और इसे कुछ शब्दकोश में प्रकाशित करना है। फिर भी, ऐसे सेट आवश्यक लोगों की तुलना में संख्याओं का एक बहुत ही सीमित स्रोत प्रदान करते हैं: ये सेट सांख्यिकीय यादृच्छिकता प्रदान करते हैं, लेकिन वे यादृच्छिक रूप से पर्याप्त नहीं हैं।

क्रिप्टोग्राफिक एप्लिकेशन यादृच्छिक संख्या उत्पन्न करने के लिए विशेष एल्गोरिदम का उपयोग करते हैं। ये एल्गोरिदम पूर्वनिर्धारित हैं और इसलिए संख्याओं का एक क्रम उत्पन्न करते हैं जो सैद्धांतिक रूप से सांख्यिकीय रूप से यादृच्छिक नहीं हो सकते हैं। उसी समय, यदि आप एक अच्छा एल्गोरिथ्म चुनते हैं, तो परिणामस्वरूप संख्यात्मक अनुक्रम सबसे यादृच्छिक परीक्षण पास करेगा। ऐसी संख्याओं को छद्म यादृच्छिक संख्या कहा जाता है।

कोई नियतात्मक एल्गोरिथ्म पूरी तरह से यादृच्छिक संख्या उत्पन्न नहीं कर सकता है, यह केवल उनके कुछ गुणों का अनुमान लगा सकता है। जैसा कि जॉन वॉन न्यूमैन ने कहा, "जो कोई भी यादृच्छिक संख्या प्राप्त करने के लिए अंकगणितीय तरीकों की कमजोरी है, वह संदेह से परे पापी है।"

सबसे सरल अंकगणितीय जनरेटर, हालांकि उनकी उच्च गति है, लेकिन कई गंभीर कमियों से पीड़ित हैं:

- बहुत कम अवधि / अवधि।
- अनुक्रमिक मूल्य स्वतंत्र नहीं हैं।
- कुछ बिट दूसरों की तुलना में "कम यादृच्छिक" हैं।
- असमान एक आयामी वितरण।
- प्रत्यावर्तन।

ऐसे RNG को कैसे बनाया जाए, जिसके नतीजे इस हद तक अप्रत्याशित होंगे कि यह संभव भी हो सके? प्रकृति में सबसे अप्रत्याशित घटनाओं में से एक क्या है और व्यावहारिक रूप से औपचारिकता के लिए उधार नहीं है, और इसलिए मॉडलिंग करने के लिए? मानव व्यवहार: व्यक्ति, जनता (भीड़, समूह, संगठन, क्लब, आदि) नहीं।

किसी व्यक्ति के व्यवहार की अप्रत्याशितता के विचार पर आरएनजी का निर्माण प्रस्तावित है। परियोजना के कार्यान्वयन के लिए, एकीकृत विकास वातावरण Microsoft Visual Studio 2010 और भाषा Visual Basic.NET का चयन किया गया था।

प्रोजेक्ट फॉर्म पर, 56 वर्ग बटन एक दूसरे के बगल में रखे गए हैं। प्रत्येक बटन एक माउसइंटर सिस्टम घटना के साथ जुड़ा हुआ है।

छवि

प्रत्येक बटन के ईवेंट हैंडलर में एक कोड होता है जो मिलीसेकंड में सिस्टम समय को प्राप्त करता है। जब आप एक बटन पर होवर करते हैं, तो एक निश्चित संख्या 0–999 की श्रेणी में संग्रहीत होती है। जब कर्सर को एक ही बटन पर दोहराया जाता है, तो एक नया नंबर सहेजा जाता है। इस प्रकार, उपयोगकर्ता मनमाने ढंग से संख्याओं की एक श्रृंखला बनाते हुए बटन फ़ील्ड पर कर्सर ले जाता है। इसे "सर्वश्रेष्ठ" अनुक्रम प्राप्त करने के लिए क्षेत्र के कम से कम 1/2 "कर्सर" (बटन पर कर्सर पकड़) की सिफारिश की जाती है (एक छोटी संख्या के साथ, कार्यक्रम आपको संख्याओं की एक श्रृंखला प्राप्त करने की अनुमति नहीं देगा)।

इसके बावजूद कि कर्सर को कितने वर्गों में खींचा गया है, परिणामस्वरूप हम हमेशा 56 अंक प्राप्त करेंगे। "लापता" संख्या इस प्रकार दिखाई देती है:

- 56 और प्रत्येक के आयामों के साथ 2 सरणियाँ बी और सी बनाई गई हैं। वैकल्पिक रूप से यादृच्छिक रूप से (एक अंतर्निहित फ़ंक्शन के साथ) सरणियां बी और सी भरी जाती हैं; प्रत्येक बार, अगले तत्व को भरने से पहले, एक यादृच्छिककरण काउंटर रीसेट किया जाता है, अन्यथा प्रत्येक अगला मान पिछले एक पर निर्भर करेगा।
- प्रोग्राम कोड का एक टुकड़ा (नीचे प्रस्तुत) सरणी भरने के लिए एल्गोरिथ्म दिखाता है:

Randomize() znak = Rnd() * 5 If znak = 0 Then a(ii) = b(ii) + c(ii) If a(ii) > 999 Then While a(ii) > 999 a(ii) = (a(ii) / 3.14) + Rnd() * 42 End While End If ElseIf znak = 1 Then a(ii) = b(ii) - c(ii) If a(ii) < 0 Then a(ii) = a(ii) * (-1) End If ElseIf znak = 2 Then a(ii) = b(ii) * c(ii) If a(ii) > 999 Then While a(ii) > 999 a(ii) = (a(ii) / 3.14) + Rnd() * 42 End While End If ElseIf znak = 3 Then a(ii) = b(ii) / (c(ii) + Rnd() * 9) If c(ii) = 0 Then c(ii) = Rnd() * 99 + 1 End If If a(ii) > 999 Then While a(ii) > 999 a(ii) = (a(ii) / 3.14) + Rnd() * 42 End While End If ElseIf znak = 4 Then a(ii) = Now.Millisecond End If 


हर बार, सरणी के अगले "बैकअप" भरने पर, रैंडमाइज () फ़ंक्शन को कहा जाता है, जो शुरुआती बिंदु के रूप में सिस्टम टाइमर के मूल्य को लेता है, न कि पिछले रैंड के मूल्य को। यही है, प्रत्येक बार, अगले अनुक्रम को उत्पन्न करते हुए, उपयोगकर्ता एक दूसरे से स्वतंत्र होने वाले विभिन्न मूल्यों के साथ, ए और बी को फिर से भरने की पहल करता है।
उपयोगकर्ता द्वारा क्षेत्र के चारों ओर पर्याप्त रूप से "क्रॉल" किए जाने के बाद, वह संबंधित बटन पर क्लिक करता है और परिणाम प्राप्त करता है।
कार्यक्रम उपयोगकर्ता को केवल तभी काम का परिणाम देखने की अनुमति देगा जब वह क्षेत्र के कम से कम आधे बटन को "सक्रिय" करेगा, अन्यथा उसे "उत्तरदायी" बटन की एक बड़ी संख्या का उपयोग करने की आवश्यकता के बारे में एक संदेश प्राप्त होगा। कार्यान्वित कार्यक्रम आपको प्राप्त डेटा को क्लिपबोर्ड पर कॉपी करने की अनुमति देता है। साथ ही, उपयोगकर्ता उत्पन्न अनुक्रम पर आंकड़े प्राप्त कर सकता है, जैसे कि पीढ़ी की शुरुआत की संख्या, अंतराल में संख्याओं का वितरण, संबंधित बटन दबाकर संख्याओं की दी गई श्रृंखला का योग।

चौकोर बटन को एक बिल्कुल अराजक क्रम में व्यवस्थित किया जाता है, अर्थात, पहला बटन (यदि आप इसे कर्सर के साथ उपयोग करते हैं) जरूरी नहीं कि अनुक्रम की पहली संख्या, आदि का निर्धारण किया जाए, जो "यादृच्छिकता" को और बेहतर बनाता है, इसलिए भले ही आप पूरे क्षेत्र में लाइन से लाइन लगाते हों, बेहद तेज़ गति से। , यह प्राप्त अनुक्रम की स्थिरता को निर्धारित करना संभव नहीं होगा। यह भविष्यवाणी करना असंभव है कि उपयोगकर्ता कैसे व्यवहार करेगा, किस क्रम में वह वर्गों पर कर्सर ले जाएगा, कौन से सक्रिय होंगे, कौन से नहीं। यह ध्यान दिया जाना चाहिए कि कर्सर आंदोलनों के समान एल्गोरिथ्म को दोहराते समय, हम अलग-अलग नंबर प्राप्त करेंगे: यह उसी समय अवधि में प्राप्त करना असंभव है जिसमें पिछले कर्सर पथ को "खींचा" गया था, क्योंकि मानव प्रतिक्रिया बस इसके लिए सक्षम नहीं है। इस प्रकार, प्रस्तावित जनरेटर की गुणवत्ता एंट्रॉपी के एक बाहरी स्रोत के कारण, अंतर है:

- फॉर्म पर बटनों की यादृच्छिक व्यवस्था;
- उपयोगकर्ता द्वारा उनकी पसंद की मनमानी;
- इस पसंद के समय अंतराल की अप्रत्याशितता।
इस जनरेटर का परीक्षण कार्य की गुणवत्ता के लिए किया गया था:
- एक दुर्घटना;
- समान वितरण;
- सांख्यिकीय स्वतंत्रता।

अलग-अलग लोगों द्वारा, अलग-अलग समय पर, बार-बार परीक्षण किया गया। परीक्षण लागू किए गए थे: चोटी की कसौटी, एक समान वितरण परीक्षण: गणितीय अपेक्षा, विचरण, मानक विचलन, आवृत्ति परीक्षण, ची-वर्ग परीक्षण, सांख्यिकीय स्वतंत्रता परीक्षण, ऑटोकारोलेशन की कमी। अधिकांश परीक्षणों ने इस जनरेटर (कम से कम 90%) की विश्वसनीयता को दिखाया, ची-स्क्वायर परीक्षण ने 99% विश्वसनीयता दिखाई, व्यक्तिगत आंकड़ों के परीक्षण ने हमेशा समान वितरण के लिए संदर्भ वाले लोगों के करीब परिणाम दिखाए।

युपीडी:
यदि सॉफ़्टवेयर कार्यान्वयन दिलचस्प है, तो मैंने इसे यहां डाउनलोड किया है । मैंने एक साल से अधिक समय पहले लिखा था, मुझे आशा है कि तब से प्रोग्रामिंग कौशल में सुधार हुआ है :)

Source: https://habr.com/ru/post/In175881/


All Articles