कैसे छद्म आयामी और वास्तव में यादृच्छिक संख्या अलग हैं और यह क्यों मायने रखता है?


665

मुझे यह कभी नहीं मिला। जैसे आप कहते हैं कि आप किसी भी भाषा में एक छोटा सा प्रोग्राम लिखते हैं, जिसमें कुछ पासा आते हैं (उदाहरण के रूप में पासा का उपयोग करके)। 600,000 रोल के बाद, प्रत्येक संख्या को लगभग 100,000 बार रोल किया गया होगा, जो कि मुझे उम्मीद है।

'सत्य यादृच्छिकता' के लिए समर्पित वेबसाइटें क्यों हैं? निश्चित रूप से, ऊपर दिए गए अवलोकन को देखते हुए, किसी भी संख्या को प्राप्त करने की संभावना लगभग 1 से अधिक है कि वह कितनी संख्या में से चुन सकता है।

मैंने इसे पायथन में आज़माया : यहाँ 60 मिलियन रोल का परिणाम है। उच्चतम भिन्नता 0.15 की तरह है। क्या यह उतना यादृच्छिक नहीं है जितना कि यह मिलने वाला है?

1 - 9997653 2347.0
2 - 9997789 2211.0
3 - 9996853 3147.0
4 - 10006533 -6533.0
5 - 10002774 -2774.0
6 - 9998398 1602.0

1
हार्डवेयर जनरेटेड रैंडम नंबरों पर विकिपीडिया लेख पर एक नज़र डालें
स्टेफिश

21
"कुछ पाँसा रोल" से आपका क्या अभिप्राय है? क्या इसमें एक रोबोट हाथ और कैमरा जुड़ा हुआ है?
स्टारबेल

3
जब मैं आपके स्वर की सामान्य बात से सहमत हूं, कि हम अक्सर इस बारे में बहुत अधिक चिंता करते हैं, लेकिन वास्तविक जीवन में इसका शोषण किया गया है: en.wikipedia.org/wiki/Ronald_Dale_Harris
ग्रैडी प्लेयर

3
एक ऑनलाइन पोकर खेल के बारे में यह लेख देखें कि यह क्यों मायने रखता है, इसके लिए सच्ची यादृच्छिकता गायब है।
वरक्विलेक्स

1
यदि आप सिर्फ ०-५ काउंटर रखते हैं और ६६६ गोरिलियन समय के अनुसार पासा रोल करते हैं, तो आपको समान वितरण भी मिलेगा।
जकोरा

जवाबों:


1384

चलो कुछ कंप्यूटर पोकर खेलते हैं, बस आप, मैं और सर्वर हम दोनों पर भरोसा करते हैं। सर्वर एक छद्म यादृच्छिक संख्या जनरेटर का उपयोग करता है जिसे हम खेलने से पहले 32-बिट बीज के साथ आरंभीकृत किया जाता है। तो लगभग चार बिलियन संभव डेक हैं।

मेरे हाथ में पांच कार्ड हैं - जाहिर है कि हम टेक्सास होल्ड 'एम नहीं खेल रहे हैं। मान लीजिए कि कार्डों में से एक को मुझे, एक को आप को, एक को मुझे, एक को आप से निपटाया जाता है। इसलिए मेरे पास डेक में पहले, तीसरे, पांचवें, सातवें और नौवें कार्ड हैं।

पहले मैंने छद्म यादृच्छिक संख्या जनरेटर को चार बिलियन बार चलाया, एक बार प्रत्येक बीज के साथ, और एक डेटाबेस में प्रत्येक के लिए उत्पन्न पहले कार्ड को लिखा। मान लीजिए मेरा पहला कार्ड हुकुम की रानी है। यह केवल उन संभावित डेक के हर 52 में से एक में पहले कार्ड के रूप में एक दिखाता है, इसलिए हमने संभावित डेक को चार अरब से लगभग 80 मिलियन या तो घटा दिया है।

मान लीजिए कि मेरा दूसरा कार्ड तीन दिलों का है। अब मैं 80 मिलियन बीजों का उपयोग करके अपने RNG को 80 मिलियन से अधिक बार चलाता हूं जो पहले नंबर के रूप में हुकुम की रानी का उत्पादन करता है। यह मुझे कुछ सेकंड के लिए ले जाता है। मैं सभी डेक को लिखता हूं जो तीसरे कार्ड के रूप में तीन दिलों का उत्पादन करता है - मेरे हाथ में दूसरा कार्ड। यह फिर से डेक के केवल 2% के बारे में है, इसलिए अब हम 2 मिलियन डेक के नीचे हैं।

मान लीजिए मेरे हाथ में तीसरा कार्ड क्लबों के 7 है। मेरे पास 2 मिलियन बीजों का एक डेटाबेस है जो मेरे दो कार्डों का निपटारा करता है; मैं अपने RNG को उन डेक के 2% को खोजने के लिए 2 लाख बार चलाता हूं जो 7 के क्लबों को तीसरे कार्ड के रूप में बनाते हैं, और हम केवल 40 हजार डेक तक नीचे हैं।

आप देखें कि यह कैसे होता है। मैं अपने चौथे कार्ड का उत्पादन करने वाले सभी बीजों को खोजने के लिए अपने RNG 40000 से अधिक बार चलाता हूं, और जो हमें 800 डेक तक ले जाता है, और फिर ~ 20 बीज प्राप्त करने के लिए 800 बार इसे चलाता हूं, जो मेरा पांचवा कार्ड बनाता है, और अब मैं बस उन बीस डेक कार्ड को उत्पन्न करें और मुझे पता है कि आपके पास बीस संभावित हाथों में से एक है। इसके अलावा, मेरे पास एक बहुत अच्छा विचार है कि मैं आगे क्या आकर्षित करने जा रहा हूं।

अब आप देखें कि सच्ची यादृच्छिकता महत्वपूर्ण क्यों है? जिस तरह से आप इसका वर्णन करते हैं, आपको लगता है कि वितरण महत्वपूर्ण है, लेकिन वितरण वह नहीं है जो एक प्रक्रिया को यादृच्छिक बनाता है। अप्रत्याशितता वह है जो एक प्रक्रिया को यादृच्छिक बनाती है।

अपडेट करें

(अब उनकी असंयमित प्रकृति के कारण हटाए गए) टिप्पणियों के आधार पर, कम से कम 0.3% लोग जिन्होंने इसे पढ़ा है, वे मेरी बात के अनुसार भ्रमित हैं। लोगों अंक मैं नहीं किया है, या बुरा के खिलाफ बहस करते हैं, लोगों का तर्क है के लिए अंक है कि मैं था धारणा है कि मैं उन्हें नहीं था पर बना है, तो मुझे पता है कि मैं और अधिक स्पष्ट रूप से और ध्यान से समझाने के लिए की जरूरत है।

शब्द वितरण के आसपास विशेष रूप से भ्रम होने लगता है इसलिए मैं ध्यान से यूज़ेज को कॉल करना चाहता हूं।

हाथ में प्रश्न हैं:

  • छद्म आयामी संख्याएँ और वास्तव में यादृच्छिक संख्याएँ कैसे भिन्न होती हैं?
  • अंतर महत्वपूर्ण क्यों है?
  • क्या PRNG के आउटपुट के वितरण के साथ कुछ मतभेद हैं?

चलो पोकर खेलने के लिए जिसके साथ कार्ड का एक यादृच्छिक डेक उत्पन्न करने के लिए सही तरीके पर विचार करके शुरू करते हैं । फिर हम देखेंगे कि डेक बनाने के लिए अन्य तकनीकें कैसे भिन्न हैं, और यदि उस अंतर का लाभ उठाना संभव है।

चलो यह मानकर शुरू करते हैं कि हमारे पास एक जादुई बॉक्स है TRNG। इसके इनपुट के रूप में हम इसे एक पूर्णांक n से अधिक या एक के बराबर देते हैं, और इसके आउटपुट के रूप में यह हमें एक और n, समावेशी के बीच सही मायने में यादृच्छिक संख्या देता है। बॉक्स का आउटपुट पूरी तरह से अप्रत्याशित है (जब एक के अलावा एक नंबर दिया जाता है) और एक और n के बीच की कोई भी संख्या एक दूसरे के रूप में होने की संभावना है; यह कहना है कि वितरण एक समान है । (यादृच्छिकता के अन्य अधिक उन्नत सांख्यिकीय चेक हैं जो हम प्रदर्शन कर सकते हैं; मैं इस बिंदु को अनदेखा कर रहा हूं क्योंकि यह मेरे तर्क के लिए जर्मन नहीं है। धारणा के अनुसार TRNG पूरी तरह से सांख्यिकीय रूप से यादृच्छिक है।)

हम ताश के पत्तों के एक अप्रकाशित डेक से शुरू करते हैं। हम बॉक्स को एक और 52 के बीच की संख्या के लिए पूछते हैं - अर्थात TRNG(52)। जो भी नंबर वापस देता है, हम अपने सॉर्ट किए गए डेक से उस कार्ड को गिनते हैं और उस कार्ड को निकाल देते हैं। यह फेरबदल डेक में पहला कार्ड बन जाता है। फिर हम TRNG(51)दूसरे कार्ड का चयन करने के लिए कहते हैं और ऐसा ही करते हैं।

इसे देखने का एक और तरीका है: 52 हैं! = 52 x 51 x 50 ... x 2 x 1 संभावित डेक, जो लगभग 2 226 है । हमने उनमें से एक को सही मायने में यादृच्छिक पर चुना है।

अब हम कार्डों का सौदा करते हैं। जब मैं अपने कार्ड को देखता हूं तो मुझे पता नहीं चलता कि आपके पास क्या कार्ड है। (इस तथ्य के अलावा कि आपके पास मेरे पास कोई कार्ड नहीं है।) वे समान संभावना वाले किसी भी कार्ड हो सकते हैं।

तो मुझे यह सुनिश्चित करने दें कि मैं इसे स्पष्ट रूप से समझाऊं। हमारे पास प्रत्येक व्यक्तिगत आउटपुट का समान वितरण है TRNG(n); प्रत्येक 1 और n के बीच प्रायिकता 1 / n के साथ एक संख्या चुनता है। साथ ही, इस प्रक्रिया का परिणाम यह है कि हमने 52 में से एक को चुना है! 1/52 की सम्भावना !, तो वितरण के साथ संभव डेक संभव डेक के समूह के ऊपर है भी वर्दी।

ठीक है।

अब मान लेते हैं कि हमारे पास एक कम मैजिक बॉक्स है, जिसे लेबल किया गया है PRNG। उपयोग करने से पहले, इसे 32-बिट अहस्ताक्षरित संख्या के साथ सीड किया जाना चाहिए ।

ASIDE: 32 क्यों ? क्या यह 64- या 256- या 10000-बिट संख्या के साथ नहीं हो सकता है? ज़रूर। लेकिन (1) व्यवहार में अधिकांश ऑफ-द-शेल्फ PRNG को 32-बिट संख्या के साथ वरीयता दी जाती है, और (2) यदि आपके पास बीज बनाने के लिए यादृच्छिकता के 10000 बिट्स हैं तो आप PRNG का उपयोग क्यों कर रहे हैं? आपके पास पहले से ही यादृच्छिकता के 10000 बिट्स का स्रोत है!

वैसे भी, PRNG कैसे काम करता है: इस पर अंकुरित होने के बाद, आप इसे उसी तरह उपयोग कर सकते हैं जैसे आप उपयोग करते हैं TRNG। यही है, आप इसे एक संख्या, n पास करते हैं, और यह आपको 1 और n के बीच एक संख्या वापस देता है, समावेशी। इसके अलावा, उस आउटपुट का वितरण कम या ज्यादा समान है । यही है, जब हम PRNG1 और 6 के बीच संख्या पूछते हैं, तो हमें 1, 2, 3, 4, 5 या 6 प्रत्येक समय का लगभग एक छठा मिलता है, कोई फर्क नहीं पड़ता कि बीज क्या था।

मैं इस बिंदु पर कई बार जोर देना चाहता हूं क्योंकि ऐसा लगता है कि कुछ टिप्पणीकारों को भ्रमित कर रहा है। PRNG का वितरण कम से कम दो तरीकों से एक समान है। पहला, मान लीजिए कि हम किसी विशेष बीज को चुनते हैं। हम उम्मीद करेंगे कि अनुक्रम PRNG(6), PRNG(6), PRNG(6)...एक मिलियन बार 1 और 6. के बीच संख्याओं का एक समान वितरण का उत्पादन करेगा और दूसरा, अगर हमने एक लाख अलग-अलग बीजों को चुना और प्रत्येक बीज के लिए एक PRNG(6) बार कॉल किया, तो हम 1 से संख्याओं के एक समान वितरण की उम्मीद करेंगे 6. इनमें से किसी भी ऑपरेशन में PRNG की एकरूपता मेरे द्वारा बताए गए हमले के लिए प्रासंगिक नहीं है

इस प्रक्रिया को छद्म यादृच्छिक कहा जाता है क्योंकि बॉक्स का व्यवहार वास्तव में पूरी तरह से नियतात्मक है; यह बीज के आधार पर 2 32 संभावित व्यवहारों में से एक को चुनता है । यही है, एक बार यह बोया जाता है, एक समान वितरण के साथ संख्याओं PRNG(6), PRNG(6), PRNG(6), ... का एक क्रम पैदा करता है , लेकिन यह अनुक्रम पूरी तरह से बीज द्वारा निर्धारित किया जाता है। कॉल के दिए गए अनुक्रम के लिए, कहें, PRNG (52), PRNG (51) ... और इसी तरह, केवल 2 32 संभावित क्रम हैं। बीज अनिवार्य रूप से चुनता है कि हमें कौन सा मिलता है।

एक डेक उत्पन्न करने के लिए सर्वर अब एक बीज उत्पन्न करता है। (कैसे? हम उस बिंदु पर वापस आएंगे।) फिर वे कॉल करते हैं PRNG(52), PRNG(51)और इसी तरह डेक उत्पन्न करने के लिए, पहले की तरह।

यह प्रणाली मेरे द्वारा वर्णित हमले के लिए अतिसंवेदनशील है। पहले हम सर्वर पर हमला करने के लिए, समय से पहले, 0 के साथ बॉक्स की अपनी प्रति को सीड करें और PRNG(52)नीचे लिखें और लिखें। फिर हम 1 के साथ फिर से बीज डालते हैं, पूछते हैं PRNG(52), और नीचे लिखते हैं, पूरे रास्ते में 2 32 -1।

अब, पोकर सर्वर जो PRNG का उपयोग डेक उत्पन्न करने के लिए करता है, उसे किसी तरह एक बीज उत्पन्न करना होता है। इससे कोई फर्क नहीं पड़ता कि वे ऐसा कैसे करते हैं। वे TRNG(2^32)वास्तव में यादृच्छिक बीज प्राप्त करने के लिए कॉल कर सकते हैं । या वे वर्तमान समय को बीज के रूप में ले सकते हैं, जो शायद ही यादृच्छिक है; मुझे पता है कि यह समय आपके लिए कितना है। मेरे हमले की बात यह है कि इससे कोई फर्क नहीं पड़ता, क्योंकि मेरे पास मेरा डेटाबेस है । जब मैं अपना पहला कार्ड देखता हूं तो मैं 98% संभावित बीजों को खत्म कर सकता हूं। जब मैं अपना दूसरा कार्ड देखता हूं, तो मैं 98% तक समाप्त कर सकता हूं, और इसी तरह, जब तक कि मैं संभव मुट्ठी भर बीज तक नीचे नहीं जा सकता, और उच्च संभावना के साथ जान सकता हूं कि आपके हाथ में क्या है।

अब, फिर से, मैं इस बात पर ज़ोर देना चाहता हूँ कि यहाँ धारणा यह है कि अगर हम PRNG(6)एक लाख बार कहें तो हमें प्रत्येक संख्या लगभग छठे समय मिलेगी । वह वितरण (अधिक या कम) एकसमान है , और यदि उस वितरण की एकरूपता आप सभी के बारे में परवाह है , तो यह ठीक है। सवाल का मुद्दा यह था कि क्या अन्य चीजें हैं जिनके वितरण की PRNG(6)हमें परवाह है? और जवाब हां है । हम अप्रत्याशितता के बारे में भी परवाह करते हैं ।

समस्या को देखने का एक और तरीका यह है कि भले ही मिलियन कॉल का वितरण PRNG(6)ठीक हो, क्योंकि PRNG केवल 2 32 संभावित व्यवहारों में से चुन रहा है, यह हर संभव डेक उत्पन्न नहीं कर सकता है। यह 2 226 संभावित डेक में से केवल 2 32 उत्पन्न कर सकता है ; एक छोटा सा अंश। तो सभी डेक के सेट पर वितरण बहुत खराब है। लेकिन फिर से, यहां मौलिक हमला हमारे उत्पादन के एक छोटे से नमूने से अतीत और भविष्य के व्यवहार की सफलतापूर्वक भविष्यवाणी करने में सक्षम होने पर आधारित है । PRNG

मुझे यह सुनिश्चित करने के लिए कि यह सिंक में तीन या चार बार है। यहां तीन वितरण हैं। सबसे पहले, उस प्रक्रिया का वितरण जो यादृच्छिक 32-बिट बीज का उत्पादन करता है। यह पूरी तरह से यादृच्छिक, अप्रत्याशित और वर्दी हो सकता है और हमला अभी भी काम करेगा । दूसरा, एक मिलियन कॉल का वितरण PRNG(6)। यह पूरी तरह से एक समान हो सकता है और हमला अभी भी काम करेगा। तीसरा, मेरे द्वारा वर्णित छद्म यादृच्छिक प्रक्रिया द्वारा चुने गए डेक का वितरण। वह वितरण अत्यंत घटिया है; IRL संभव डेक का केवल एक छोटा सा अंश संभवतः चुना जा सकता है। यह हमला इसके उत्पादन के आंशिक ज्ञान के आधार पर PRNG के व्यवहार की पूर्वानुमेयता पर निर्भर करता है ।

ASIDE: इस हमले के लिए आवश्यक है कि हमलावर को पता हो या अनुमान लगाने में सक्षम हो कि PRNG द्वारा उपयोग किया गया सटीक एल्गोरिदम क्या है। वह वास्तविक है या नहीं यह एक खुला प्रश्न है। हालाँकि, सुरक्षा प्रणाली को डिज़ाइन करते समय आपको इसे हमलों के खिलाफ सुरक्षित रहने के लिए डिज़ाइन करना चाहिए, भले ही हमलावर कार्यक्रम के सभी एल्गोरिदम को जानता हो । एक और तरीका रखो: एक सुरक्षा प्रणाली के हिस्से को जो सिस्टम के सुरक्षित रहने के लिए गुप्त रहना चाहिए उसे "कुंजी" कहा जाता है। यदि आपका सिस्टम उस एल्गोरिदम पर अपनी सुरक्षा के लिए निर्भर करता है जिसे आप गुप्त होने का उपयोग करते हैं तो आपकी कुंजी में उन एल्गोरिदम होते हैं । यह एक अत्यंत कमजोर स्थिति है!

आगे बढ़ते रहना।

अब मान लेते हैं कि हमारे पास एक तीसरा मैजिक बॉक्स लेबल है CPRNG। यह एक क्रिप्टो-शक्ति संस्करण है PRNG। यह 32-बिट बीज के बजाय 256-बिट बीज लेता है। यह PRNGसंपत्ति के साथ साझा करता है जो बीज 2 256 संभावित व्यवहारों में से एक को चुनता है। और हमारी अन्य मशीनों की तरह, इसके पास संपत्ति है कि बड़ी संख्या में CPRNG(n)1 और n के बीच परिणाम का एक समान वितरण का उत्पादन करने के लिए: प्रत्येक समय का 1 / n होता है। क्या हम इसके खिलाफ अपना हमला चला सकते हैं?

हमारे मूल हमले के लिए हमें बीज से 2 32 मैपिंग स्टोर करने की आवश्यकता है PRNG(52)। लेकिन 2 256 एक बहुत बड़ी संख्या है; यह CPRNG(52)कई बार चलाने और परिणामों को संग्रहीत करने के लिए पूरी तरह से संभव है ।

लेकिन मान लीजिए कि बीज के बारे में एक तथ्य को कम करने और उससे मूल्य लेने का कोई और तरीका है CPRNG(52)? हम अभी तक बहुत गूंगे हो गए हैं, बस सभी संभावित संयोजनों को मजबूर कर रहे हैं। क्या हम जादू बॉक्स के अंदर देख सकते हैं, यह पता लगा सकते हैं कि यह कैसे काम करता है, और आउटपुट के आधार पर बीज के बारे में तथ्यों को घटाता है?

नहीं। विवरण स्पष्ट करने के लिए बहुत जटिल हैं, लेकिन CPRNG को बड़ी चतुराई से डिजाइन किया गया है ताकि बीज के बारे में किसी भी उपयोगी तथ्य को पहले आउटपुट से CPRNG(52)या आउटपुट के किसी भी सबसेट से घटाया जा सके , चाहे वह कितना भी बड़ा क्यों न हो

ठीक है, तो अब मान लीजिए कि सर्वर CPRNGडेक उत्पन्न करने के लिए उपयोग कर रहा है। इसके लिए 256-बिट बीज की आवश्यकता होती है। यह उस बीज को कैसे चुनता है? यदि यह किसी भी मूल्य को चुनता है जो एक हमलावर भविष्यवाणी कर सकता है तो अचानक हमला फिर से व्यवहार्य हो जाता है । यदि हम 2 256 संभावित बीजों को निर्धारित कर सकते हैं, तो सर्वर द्वारा उनमें से केवल चार बिलियन चुने जाने की संभावना है, फिर हम व्यवसाय में वापस आ गए हैं । हम इस हमले को फिर से माउंट कर सकते हैं, केवल उन छोटे बीजों पर ध्यान दे जो संभवतः उत्पन्न हो सकते हैं।

इसलिए सर्वर को यह सुनिश्चित करने के लिए काम करना चाहिए कि 256-बिट संख्या समान रूप से वितरित की जाती है - अर्थात, प्रत्येक संभावित बीज को 1/2 256 की संभावना के साथ चुना जाता है । मूल रूप से सर्वर के TRNG(2^256)-1लिए बीज उत्पन्न करने के लिए कॉल किया जाना चाहिए CPRNG

क्या होगा यदि मैं सर्वर को हैक कर सकता हूं और यह देखने के लिए सहकर्मी को चुन सकता हूं कि क्या बीज चुना गया था? उस स्थिति में, हमलावर CPRNG का पूरा अतीत और भविष्य जानता है । सर्वर के लेखक को इस हमले से बचना चाहिए! (निश्चित रूप से अगर मैं इस हमले को सफलतापूर्वक पार कर सकता हूं तो मैं शायद अपने बैंक खाते में सीधे पैसा भी स्थानांतरित कर सकता हूं, इसलिए शायद यह दिलचस्प नहीं है। बिंदु यह है: बीज को एक कठिन-से-गुप्त रहस्य होना चाहिए, और एक वास्तव में यादृच्छिक 256-बिट संख्या का अनुमान लगाना बहुत कठिन है।)

रक्षा-में-गहराई के बारे में मेरे पहले बिंदु पर लौटना: 256-बिट बीज इस सुरक्षा प्रणाली की कुंजी है। CPRNG का विचार है कि जब तक कुंजी सुरक्षित है तब तक सिस्टम सुरक्षित है ; भले ही एल्गोरिथ्म के बारे में प्रत्येक अन्य तथ्य ज्ञात हो, जब तक आप कुंजी को गुप्त रख सकते हैं, प्रतिद्वंद्वी के कार्ड अप्रत्याशित होते हैं।

ठीक है, इसलिए बीज को गुप्त और समान रूप से वितरित किया जाना चाहिए क्योंकि यदि यह नहीं है, तो हम एक हमले को माउंट कर सकते हैं। हमारे पास यह धारणा है कि आउटपुट का वितरण CPRNG(n)एक समान है। सभी संभावित डेक के सेट पर वितरण के बारे में क्या?

आप कह सकते हैं: CPRNG द्वारा 2 256 संभावित अनुक्रम आउटपुट हैं, लेकिन केवल 2 226 संभावित डेक हैं। इसलिए डेक की तुलना में अधिक संभव अनुक्रम हैं, इसलिए हम ठीक हैं; इस प्रणाली में अब हर संभव IRL डेक (उच्च संभावना के साथ) संभव है। और इसके अलावा एक अच्छा तर्क है ...

2 226 केवल एक है सन्निकटन 52 की !. इसे विभाजित करें। २ २५० / ५२! संभवतः एक पूरी संख्या नहीं हो सकती क्योंकि एक चीज के लिए, 52! 3 से विभाज्य है लेकिन दो की कोई शक्ति नहीं है! चूंकि यह एक पूर्ण संख्या नहीं है, अब हमारे पास ऐसी स्थिति है जहां सभी डेक संभव हैं , लेकिन कुछ डेक दूसरों की तुलना में अधिक संभावना है

यदि यह स्पष्ट नहीं है, तो छोटी संख्या के साथ स्थिति पर विचार करें। मान लीजिए कि हमारे पास तीन कार्ड हैं, ए, बी और सी। मान लीजिए कि हम 8-बिट बीज के साथ एक PRNG का उपयोग करते हैं, इसलिए 256 ग्राम बीज हैं। PRNG(3)बीज के आधार पर 256 संभावित आउटपुट होते हैं ; उनमें से एक तिहाई के ए होने का कोई तरीका नहीं है, उनमें से एक तिहाई बी हैं और उनमें से एक तिहाई सी हैं क्योंकि 256 समान रूप से विभाज्य नहीं हैं। 3. उनमें से एक के लिए एक छोटा सा पूर्वाग्रह होना चाहिए।

इसी तरह, 52 समान रूप से 2 256 में विभाजित नहीं होता है , इसलिए कुछ कार्डों के प्रति कुछ पूर्वाग्रह होना चाहिए क्योंकि पहला कार्ड चुना गया है और एक पूर्वाग्रह दूसरों से दूर है।

32-बिट बीज वाले हमारे मूल सिस्टम में एक बड़े पैमाने पर पूर्वाग्रह था और संभव डेक के विशाल बहुमत का उत्पादन कभी नहीं किया गया था। इस प्रणाली में सभी डेक का उत्पादन किया जा सकता है, लेकिन डेक का वितरण अभी भी त्रुटिपूर्ण है । कुछ डेक दूसरों की तुलना में बहुत अधिक संभावना रखते हैं।

अब सवाल यह है कि क्या हमारे पास इस दोष के आधार पर हमला है? और जवाब व्यवहार में है, शायद नहीं । CPRNGs ताकि तैयार कर रहे हैं , तो बीज को सही मायने में यादृच्छिक है तो यह computationally अव्यवहार्य है के बीच अंतर बताने के लिए CPRNGऔर TRNG

ठीक है, तो चलो योग करें।

छद्म आयामी संख्याएँ और वास्तव में यादृच्छिक संख्याएँ कैसे भिन्न होती हैं?

वे जिस पूर्वानुमानशीलता को प्रदर्शित करते हैं उसके स्तर में भिन्नता है।

  • सचमुच यादृच्छिक संख्या पूर्वानुमान योग्य नहीं है।
  • सभी छद्म यादृच्छिक संख्याओं का अनुमान लगाया जा सकता है यदि बीज का निर्धारण या अनुमान लगाया जा सकता है।

अंतर महत्वपूर्ण क्यों है?

क्योंकि ऐसे अनुप्रयोग हैं जहां सिस्टम की सुरक्षा अप्रत्याशितता पर निर्भर करती है ।

  • यदि प्रत्येक कार्ड को चुनने के लिए TRNG का उपयोग किया जाता है, तो सिस्टम उपलब्ध नहीं है।
  • यदि प्रत्येक कार्ड को चुनने के लिए CPRNG का उपयोग किया जाता है तो बीज सुरक्षित और अज्ञात दोनों होने पर सिस्टम सुरक्षित है।
  • यदि एक छोटे बीज स्थान के साथ एक साधारण PRNG का उपयोग किया जाता है, तो सिस्टम इस बात की परवाह किए बिना सुरक्षित नहीं है कि बीज अप्रत्याशित है या अज्ञात; एक छोटा सा पर्याप्त बीज स्थान जिस तरह का मैंने वर्णन किया है, उस पर जानवर के हमले के लिए अतिसंवेदनशील है।

क्या अंतर का PRNG के आउटपुट के वितरण से कोई लेना-देना है?

वितरण या के लिए उसके अभाव की एकरूपता व्यक्ति कॉल करने के लिए RNG(n)हमलों मैं का वर्णन किया है करने के लिए प्रासंगिक नहीं है।

हमने देखा के रूप में, दोनों एक PRNGऔर CPRNGसभी संभव डेक के किसी भी व्यक्ति के डेक को चुनने की संभावना के गरीब वितरण का उत्पादन। PRNGकाफी बदतर है, लेकिन दोनों समस्याएं हैं।

एक और प्रश्न:

यदि TRNG CPRNG से बहुत बेहतर है, जो बदले में PRNG से बहुत बेहतर है, तो कोई CPRNG या PRNG का उपयोग क्यों करता है?

दो कारण।

पहला: खर्च। TRNG महंगा है । वास्तव में यादृच्छिक संख्या उत्पन्न करना मुश्किल है। CPRNG, मनमाने ढंग से कई कॉल के लिए अच्छे परिणाम देते हैं, केवल एक कॉल के लिए TRNG को बीज के लिए। नीचे का पक्ष यह है कि आपको उस बीज को गुप्त रखना होगा

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

मुझे उम्मीद है कि अब बहुत स्पष्ट है।

अंत में, यदि आपने इसका आनंद लिया, तो आप यादृच्छिकता और क्रमपरिवर्तन के विषय पर आगे पढ़ने का आनंद ले सकते हैं:


20
ठीक है, लड़कों और लड़कियों। अभी के लिए यह पर्याप्त टिप्पणी है। यदि आप इस पर आगे चर्चा करना चाहते हैं, तो अपने आप को एक चैटरूम, kthnxbye हड़प लें!
इवो ​​फ्लिप

1
@ एरिक लेकिन प्रत्येक नए डेक ड्रा से पहले बीज को रीसेट नहीं किया जाता है, क्या यह है? इसलिए जब आप सही होते हैं कि केवल कुछ ही प्रक्षेपवक्र होते हैं जिनसे हम नमूना लेते हैं, तो आप ठीक-ठीक नहीं जानते कि जिस क्षण और प्रक्षेप पथ में आप हैं उस प्रक्षेपवक्र में कहाँ हैं।
एएस


संबंधित मुद्दों का एक अच्छा (लेकिन सघन) उपचार नूथ के TAOCP खंड 2 में है, खंड 3.5 "एक यादृच्छिक क्रम क्या है?" (पृष्ठ 149), जो सम-विषम, के-वितरित और ∞-वितरित अनुक्रमों की प्रबुद्ध परिभाषाओं के साथ शुरू होता है। स्यूडोरैंडम अनुक्रमों की चर्चा 3.5.F (पृष्ठ 170) में की गई है। जटिलता सिद्धांत और जर्मन बीएसआई से छद्म विज्ञान के मापदंड भी देखें ।
श्रीवत्सआर

160

जैसा कि एरिक लिपर्ट कहते हैं, यह सिर्फ वितरण नहीं है। यादृच्छिकता को मापने के अन्य तरीके हैं।

प्रारंभिक यादृच्छिक संख्या जनरेटर में से एक में कम से कम महत्वपूर्ण बिट में एक अनुक्रम है - यह 0 और 1 के वैकल्पिक है। इसलिए एलएसबी 100% अनुमानित था। लेकिन आपको इससे ज्यादा चिंता करने की जरूरत है। प्रत्येक बिट अप्रत्याशित होना चाहिए।

यहाँ समस्या के बारे में सोचने का एक अच्छा तरीका है। मान लें कि आप यादृच्छिकता के 64 बिट्स उत्पन्न कर रहे हैं। प्रत्येक परिणाम के लिए, पहले 32 बिट्स (ए), और अंतिम 32 बिट्स (बी) लें, और एक सरणी x [ए, बी] में एक इंडेक्स बनाएं। अब एक लाख बार परीक्षण करें, और प्रत्येक परिणाम के लिए, उस नंबर पर सरणी बढ़ाएँ, यानी एक्स [ए, बी] ++;

अब एक 2 डी आरेख बनाएं, जहां संख्या जितनी अधिक होगी, उस स्थान पर पिक्सेल को जितना बड़ा किया जाएगा।

यदि यह वास्तव में यादृच्छिक है, तो रंग एक समान ग्रे होना चाहिए। लेकिन आपको पैटर्न मिल सकता है। उदाहरण के लिए Windows NT सिस्टम के TCP अनुक्रम संख्या में "यादृच्छिकता" के इस आरेख को लें:

Windows NT

या यह भी विंडोज 98 से एक:

विंडोज 98

और यहाँ सिस्को राउटर (IOS) कार्यान्वयन की यादृच्छिकता है। सिस्को आईएसओ

ये चित्र मिचेल ज़ाल्वस्की के पेपर के सौजन्य से हैं । इस विशेष मामले में, यदि कोई यह अनुमान लगा सकता है कि टीसीपी अनुक्रम संख्या एक प्रणाली की होगी, तो कोई अन्य प्रणाली से संबंध बनाते समय उस प्रणाली को लागू कर सकता है - जो कनेक्शनों के अपहरण, संचार के अवरोधन, आदि की अनुमति देगा और भले ही हम यदि हम अपने नियंत्रण में एक नया कनेक्शन बनाने का कारण बन सकते हैं, तो हम अगले 100% समय की भविष्यवाणी नहीं कर सकते, हम सफलता की संभावना बढ़ा सकते हैं। और जब कंप्यूटर कुछ ही सेकंड में 100,000 कनेक्शन उत्पन्न कर सकते हैं, तो एक सफल हमले की संभावना खगोलीय से संभव या यहां तक ​​कि संभव हो जाती है।


30
यह इतना शानदार है कि यह मेरी आंखों में आंसू ला देता है। एक ऐसा ऐप होना चाहिए जो इन्हें हर OS (मोबाइल / डेस्कटॉप / सर्वर) और प्लेटफ़ॉर्म (JVM / Javascript / etc) के लिए बनाए।
एचडीव

5
विंडोज रैंड () फ़ंक्शन काफी अच्छा है! यह एक ऐसा क्लाउड बनाता है जिसमें कोई स्पष्ट पैटर्न नहीं है। : मेरे कार्यान्वयन बाहर यह (और अन्य एल्गोरिदम) की कोशिश करना देखें github.com/Zalastax/visualize_random
Zalastax

93

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

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

RNG हमलों के बारे में अधिक जानकारी इस विकिपीडिया लेख में मिल सकती है ।


9
क्रिप्टोग्राफ़िक PRNGs मौजूद हैं, और व्यापक रूप से उपयोग किए जाते हैं। वे एक मामूली आकार के बीज से यादृच्छिक संख्याओं की व्यावहारिक रूप से असीमित धारा उत्पन्न कर सकते हैं। इस तरह की धारा को वास्तविक यादृच्छिक संख्याओं से अलग करना कम्प्यूटेशनल रूप से संभव है, इस प्रकार इस तरह की धारा के किसी भी हिस्से से कोई अतिरिक्त जानकारी प्राप्त नहीं की जा सकती है, और किसी भी व्यावहारिक उद्देश्य के लिए संख्याएं सही यादृच्छिक संख्याओं जितनी अच्छी हैं।
आआआआआआआआआआ आआआआआह

मुझे लगता है कि यह समझाने का सबसे आसान तरीका यह है कि यादृच्छिक रूप से नंबर जनरेटर एल्गोरिदम को प्रोग्राम किया जाना है। इसका मतलब है कि निर्देशों का सेट है जिसका पालन किया जा रहा है। यदि निर्देशों का एक सेट है, तो यह यादृच्छिक नहीं हो सकता।
कल्टारी

6
@ केल्टरी आप एन्ट्रापी के तत्व को याद कर रहे हैं ... अधिकांश आरएनजी (कम से कम क्रिप्टोग्राफिक वाले) बाहरी स्रोतों से इनपुट इकट्ठा करते हैं (जैसे माउस आंदोलन) और उपयोग करें कि प्रारंभिक स्थिति के हिस्से के रूप में - इस प्रकार, से परिवर्तन को प्रोग्राम Aकिया Bजाता है लेकिन A(चाहिए) की प्रारंभिक अवस्था अस्पष्ट है। Linux का /dev/randomएक अनुमान है कि कितना एंट्रॉपी उपलब्ध है और बहुत कम होने पर नंबर देना बंद कर दें।
बेसिक

जिज्ञासा से बाहर - लावा लैंप को "वास्तव में यादृच्छिक" क्यों माना जाता है? मैं समझता हूं कि यह अप्रत्याशित व्यवहार प्रदर्शित करता है, लेकिन कोई व्यक्ति तरल पदार्थ की गतिशीलता पर पर्याप्त पकड़ रखता है और पृथ्वी के गुरुत्वाकर्षण वातावरण में उन तरल पदार्थों के साथ बातचीत कैसे कर सकता है जो निश्चित रूप से "अनुमानित" परिणाम पैदा कर सकता है, नहीं? निश्चित रूप से, लावा लैंप अप्रत्याशित हैं, लेकिन मेरे लिए, वे बिल्कुल भी यादृच्छिक नहीं हैं, लेकिन अत्यधिक अनुमानित हैं।
theGreenCabbage

1
@TheGreenCabbage: मुझे संदेह है कि लावा लैंप अराजक हैं। एक अच्छा पर्याप्त कंप्यूटर मॉडल, और सटीकता के पर्याप्त अंक को देखते हुए, आप थोड़ी देर के लिए व्यवहार का अनुमान लगा सकते हैं। लेकिन, क्योंकि प्रणाली अराजक है, प्रारंभिक स्थितियों में सबसे अधिक परिवर्तन के साथ दो लावा लैंप जल्दी से व्यवहार में विचलन करेंगे। (और यह टिप्पणी अराजक आकर्षित करने वालों को नजरअंदाज करती है।)
dmm

76

मैंने इसे पायथन में आजमाया: यहां 60 मिलियन रोल का परिणाम है। उच्चतम भिन्नता 0.15 की तरह है। क्या यह उतना यादृच्छिक नहीं है जितना कि यह मिलने वाला है?

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

    आपके वितरण में रैंडम रोल की तुलना में बहुत छोटे मानक विचलन हैं

सच्ची यादृच्छिकता सिर्फ इतना नहीं आती है कि "लगभग 1 पर औसत से अधिक कभी भी यह कितने नंबर से चुन सकता है" जो कि आप गुणवत्ता के संकेत के रूप में उपयोग कर रहे हैं।

यदि आप कई पासा रोल के लिए संभाव्यता वितरण के बारे में इस स्टैक एक्सचेंज प्रश्न को देखते हैं, तो आपको एन पासा रोल के मानक विचलन के लिए एक सूत्र दिखाई देगा (वास्तव में यादृच्छिक परिणाम मानते हुए):

 sqrt(N * 35.0 / 12.0).

उस सूत्र का उपयोग करते हुए, इसके लिए मानक विचलन :

  • 1 मिलियन रोल 1708 है
  • 60 मिलियन रोल 13229 है

यदि हम आपके परिणामों को देखें:

  • 1 मिलियन रोल: stddev (1000066, 999666, 1001523, 999452, 999294, 999994) 804
  • 60 मिलियन रोल: stddev (9997653, 9997789, 9996853, 10006533, 10002774, 9998398) 3827 है

आप फॉर्मूला से बिल्कुल मेल खाने के लिए एक परिमित नमूने के मानक विचलन की उम्मीद नहीं कर सकते हैं, लेकिन यह बहुत करीब आना चाहिए। फिर भी, 1 मिलियन रोल पर आप आधे से भी कम stddev से कम हैं, और 60 मिलियन से आप एक तिहाई से कम हैं - यह बदतर हो रहा है, और यह कोई संयोग नहीं है ...।

छद्म-आरएनजी विभिन्न संख्याओं के अनुक्रम से आगे बढ़ते हैं, जो बीज से शुरू होते हैं और एक विशिष्ट अवधि के लिए मूल संख्या का पुनरीक्षण नहीं करते हैं। उदाहरण के लिए, पुराने सी लाइब्रेरी rand()फ़ंक्शन के कार्यान्वयन में आमतौर पर 2 ^ 32 की अवधि होती है, और वे बीज को दोहराने से पहले एक बार 0 और 2 ^ 32-1 के बीच हर नंबर पर जाएंगे। इसलिए, यदि आपने 2 ^ 32 पासा का अनुकरण किया है, तो पूर्व मापांक (%) परिणाम में प्रत्येक संख्या 0 से 2 ^ 32 तक शामिल होगी, प्रत्येक 1-6 परिणाम के लिए गणना 715827883 या 715827882 होगी (2 ^ 32 में 6 का गुणांक नहीं है), और मानक विचलन इसलिए केवल 0.33 से ऊपर है। ऊपर सूत्र, 2 ^ 32 रोल के लिए सही मानक विचलन 111924 है। वैसे भी, छद्म-यादृच्छिक रोल की संख्या बढ़ने पर आप 0 मानक विचलन की ओर अभिसरित हो जाते हैं। जब रोल की संख्या अवधि का एक महत्वपूर्ण अंश है, तो यह मुद्दा महत्वपूर्ण हो सकता है, लेकिन कुछ छद्म- RNG दूसरों की तुलना में बदतर समस्याओं - या कम नमूनों के साथ भी समस्याओं का प्रदर्शन कर सकते हैं।

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


एक ठोस उदाहरण देने के लिए: कहें कि एक गणितज्ञ एक पोकर मशीन प्रोग्रामर को बताता है कि 60 मिलियन सिम्युलेटेड रोल के बाद - स्क्रीन के चारों ओर सैकड़ों छोटी "रोशनी" टिमटिमाता था, अगर 10,013,229 या उससे अधिक छक्के लगे हों, जो गणितज्ञ होने की उम्मीद करता है 1 stddev मतलब से दूर, एक छोटा भुगतान होना चाहिए। प्रति 68-95-99.7 नियम (विकिपीडिया) इस बारे में होना चाहिए 16% समय की (एक मानक विचलन के भीतर ~ 68% गिरावट / केवल आधा बाहर से ऊपर हैं)। आपके यादृच्छिक संख्या जनरेटर के साथ, यह लगभग 3.5 मानक विचलन से ऊपर है: 0.025% संभावना के तहत - लगभग किसी भी ग्राहक को यह लाभ नहीं मिलता है। विशेष रूप से उल्लिखित पृष्ठ पर उच्च विचलन तालिका देखें:

| Range    | In range   | Outside range | Approx. freq. for daily event  |
| µ ± 1σ   | 0.68268... | 1 in 3        | Twice a week                   |
| µ ± 3.5σ | 0.99953... | 1 in 2149     | Every six years                |

आप यहां सेब और संतरे की तुलना कर रहे हैं। दो मानक विचलन का एक दूसरे से कोई लेना-देना नहीं है।
जबूह १०'१४

50

मैंने सिर्फ पासा रोल उत्पन्न करने के लिए यह यादृच्छिक संख्या जनरेटर लिखा था

def get_generator():
  next = 1
  def generator():
    next += 1
    if next > 6:
      next = 1
    return next
  return generator

आप इसे इस तरह से उपयोग करें

>> generator = get_generator()
>> generator()
1
>> generator()
2
>> generator()
3
>> generator()
4
>> generator()
5
>> generator()
6
>> generator()
1

आदि। क्या आप पासा गेम चलाने वाले प्रोग्राम के लिए इस जनरेटर का उपयोग करके खुश होंगे? याद रखें, इसका वितरण ठीक वही है जो आप "वास्तव में यादृच्छिक" जनरेटर से उम्मीद करेंगे!

छद्म यादृच्छिक संख्या जनरेटर अनिवार्य रूप से एक ही काम करते हैं - वे सही वितरण के साथ अनुमानित संख्या उत्पन्न करते हैं। वे एक ही कारण के लिए खराब हैं कि ऊपर सरलीकृत यादृच्छिक संख्या जनरेटर खराब है - वे उन स्थितियों के लिए उपयुक्त नहीं हैं जहां आपको वास्तविक वितरण की आवश्यकता है, न कि केवल सही वितरण की।


2
"छद्म यादृच्छिक संख्या जनरेटर ... सही वितरण के साथ पूर्वानुमानित संख्याएँ उत्पन्न करते हैं" - सिर्फ इसलिए कि यह एक PRNG गारंटी नहीं है कि इसका सही वितरण है (वास्तव में, वाणिज्यिक लोगों द्वारा और बड़े के लिए, बिल्कुल नहीं इन उत्तरों में उल्लिखित कारण)। हालांकि, उन्हें पर्याप्त जानकारी (बीज का इस्तेमाल किया जाने वाला, बीज, उत्पादन मूल्य, w / e) की अनुमानित जानकारी दी जा सकती है, फिर भी उनके पास विचरण है।
ब्रायन एस

3
बिंदु इसके अलावा, मुझे पता है, लेकिन get_generator = lambda: itertools.cycle(range(1,7)), generator = get_generator(), next(generator) # and so onअभी भी सुरुचिपूर्ण उल्लेख करने के लिए नहीं है :)
जानूस Troelsen

2
@ ब्रायन दरअसल, एक PRNG जो समय के साथ वितरण परीक्षणों में विफल रहा, परिभाषा के अनुसार अनुमान लगाने योग्य होगा। तो कुछ बड़े एन पर, यदि आपको एन सिक्का फ्लैप में एन / 2 हेड से थोड़ा भी रास्ता मिलता है, तो आप सिर पर दांव लगाना शुरू कर सकते हैं, और आप हारने से ज्यादा जीत सकते हैं। इसी तरह, यदि आपको हेड v। Tails का सही वितरण मिला है, लेकिन सिर हमेशा जोड़े में आते हैं, तो आपके पास फिर से जीतने का नुस्खा होगा। वितरण परीक्षण हैं कि आप कैसे जानते हैं कि PRNG कोई भी अच्छा है।
जॉन किपरस्की

1
आप nonlocal next:-) भूल गए ।
कोस

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

26

आपके कंप्यूटर द्वारा किया जाने वाला रैंडम नंबर जेनरेशन अधिकांश जरूरतों के लिए उपयुक्त होता है, और आप एक ऐसे समय में आने की संभावना नहीं रखते हैं, जहां आपको वास्तव में रैंडम नंबर की जरूरत होती है।

हालांकि सच यादृच्छिक संख्या पीढ़ी के अपने उद्देश्य हैं। कंप्यूटर सुरक्षा, जुआ, बड़े सांख्यिकीय नमूने आदि में।

यदि आप यादृच्छिक संख्याओं के अनुप्रयोगों में रुचि रखते हैं, तो विकिपीडिया लेख देखें


12
बड़ा मुद्दा यह है कि जब आपको यादृच्छिक संख्या की आवश्यकता होती है जो एक हमलावर सुरक्षा कारणों से भविष्यवाणी नहीं कर सकता है।
डेविड श्वार्ट्ज

16
आप निश्चित रूप से नरक के रूप में एक ऐसे समय में आने की संभावना रखते हैं जहां आपको वास्तव में यादृच्छिक संख्या की आवश्यकता होती है। यह एक वेब पेज खोलने के लिए पर्याप्त है जो इसके साथ शुरू होता है https://...
Jan Hudec

3
@JHHudec: ठीक है, दैनिक उपयोग में, आपको किसी भी प्रोग्राम को खोलने से पहले, किसी भी प्रोग्राम को खोलने के पहले ही रैंडम नंबर्स की जरूरत होगी, एड्रेस स्पेस लेआउट रैंडमाइजेशन देखें । इसलिए इस तरह से सामान होता है।
रीड करें

5
@ जैनधेक मैं विशेष रूप से इस अर्थ में बोल रहा था कि आपको ऑनलाइन रैंडम नंबर जनरेटर का उपयोग करने की आवश्यकता होगी। ट्रू रैंडम नंबरों का अक्सर उपयोग किया जाता है, लेकिन बहुत कम लोगों को वास्तव में उन्हें स्वयं उत्पन्न करने की आवश्यकता होती है।
एलेक्स मैकेंजी

2
स्लॉट मशीनें भी PRNG का उपयोग करती हैं, TRNG की नहीं। जनरेटर हर समय चलता है और ठीक समय पर एक नंबर उठाया जाता है जिससे स्पिन बटन को धक्का दिया जाता है। PRNG का योग और सही मायने में यादृच्छिक बटन TRNG के लिए समय की मात्रा है।
रोजर डाह

26

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

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

glibc random():
    r[i] ← ( r[i-3] + r[i-31] )  % (2^32)
    output  r[i] >> 1

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

छद्म यादृच्छिक कुंजी पर प्रसिद्ध हमलों में से एक 802.11 बी WEP पर हमला है । WEP के पास 104-बिट लॉन्गटर्म कुंजी है, जिसे 24-बिट IV (काउंटर) के साथ 128 बिट कुंजी बनाने के लिए संक्षिप्त किया गया है, जो कि आरसी 4 एल्गोरिथ्म में छद्म यादृच्छिक कुंजी उत्पन्न करने के लिए लगाया गया है ।

( RC4( IV + Key ) ) XOR (message)

चाबियाँ एक दूसरे के साथ निकटता से संबंधित थीं। यहां, प्रत्येक चरण में केवल IV में 1 की वृद्धि हुई और अन्य सभी समान रहे। चूंकि यह विशुद्ध रूप से यादृच्छिक नहीं था, इसलिए यह विनाशकारी था और आसानी से टूट गया। लगभग 40000 फ्रेम का विश्लेषण करके कुंजी बरामद की जा सकती है, जो कि मिनटों की बात है। यदि WEP ने विशुद्ध रूप से यादृच्छिक 24-बिट IV का उपयोग किया, तो यह 2 ^ 24 (लगभग 16.8 मिलियन) फ्रेम तक सुरक्षित रह सकता है।

इसलिए जब संभव हो तो सुरक्षा संवेदनशील मुद्दों में शुद्ध यादृच्छिक संख्या जनरेटर के साथ जाना चाहिए।


3
मैं एक कमजोर सिफर का उपयोग करके एक बुरी तरह से डिज़ाइन किए गए प्रोटोकॉल पर WEP सामान को दोष देता हूं। आधुनिक स्ट्रीम सिफर के साथ आप IV के रूप में एक काउंटर का उपयोग कर सकते हैं।
कोडइन्चोस

2
WEP के साथ मुख्य समस्या 2 ^ 24 (लगभग 16 मिलियन) फ़्रेम में कुंजी को दोहरा रही थी। संबंधित कुंजियों के साथ यह और भी खराब था, जिससे लगभग 40000 फ्रेम में कोड को क्रैक करना संभव हो गया। यहां मुख्य बिंदु यह है कि कुंजी यादृच्छिक नहीं है। यह बारीकी से संबंधित है, इसलिए यह दरार करना आसान है।
प्रभु

1
क्रिप्टोग्राफिक कुंजी उत्पन्न करते समय क्रिप्टोग्राफी में छद्म यादृच्छिकता खराब है । यह उससे परे पूरी तरह से ठीक है। वास्तव में, RC4 एक छद्म-यादृच्छिक संख्या जनरेटर की तुलना में थोड़ा अधिक है, जो संदेश के समतल पर XORed के 128-बिट विस्तार के साथ होता है।
मैट

12

अंतर यह है कि छद्म आयामी उत्पन्न संख्याएं कुछ समय के बाद पूर्वानुमानित (दोहराई जाती हैं) होती हैं जहां सच्चे यादृच्छिक संख्याएँ नहीं होती हैं। इसे दोहराने में लगने वाली लंबाई बीज की लंबाई पर निर्भर करती है जिसका उपयोग इसकी पीढ़ी के लिए किया जाता है।

यहाँ उस विषय के बारे में एक बहुत अच्छा वीडियो है: http://www.youtube.com/watch?v=itaMNuWLzJo


पूर्वनिर्धारणता! = दोहराव। Mersenne Twister इसका एक अच्छा उदाहरण है। 624 Int32 के बाद अधिकांश कार्यान्वयन पर आप सभी अगले नंबर की भविष्यवाणी कर सकते हैं, लेकिन Mersenne ट्विस्टर अनुक्रम इससे बहुत अधिक लंबा है (2 ^ 19937 - 1)।
HoLyVieR

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

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

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

@ TheEnvironmentalist - आह! "कंप्यूटरों में शामिल महाद्वीप" ... क्या यह "हिचहाइकर गाइड टू द गैलेक्सी" नहीं है? ;-)
ysap

10

मान लें कि एक छद्म यादृच्छिक संख्या उत्पन्न होने से पहले किसी के द्वारा अनुमान लगाया जा सकता है।

तुच्छ अनुप्रयोगों के लिए एक छद्म यादृच्छिकता ठीक है, जैसा कि आपके उदाहरण के साथ, आपको कुछ मामूली भिन्नता के साथ लगभग सही प्रतिशत (लगभग कुल परिणाम का 1/6 वां भाग) मिलेगा (जिसे आप देख सकते हैं कि क्या आप एक पासा 600k रोल करने के लिए थे बार);

हालाँकि, जब यह कंप्यूटर सुरक्षा जैसी चीजों की बात आती है; सच्ची यादृच्छिकता की आवश्यकता है।

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

यदि कोई हमलावर यह जान सकता है कि आपके कंप्यूटर को चुनने के लिए दो 'यादृच्छिक' नंबर क्या हैं, तो वे आपकी निजी कुंजी की गणना करने के लिए एक ही चरण कर सकते हैं (वह जिसे किसी और को पता नहीं है!)

आपकी निजी कुंजी के साथ एक हमलावर आप की तरह काम कर सकता है) अपने बैंक से बात करें जो आप होने का नाटक कर रहे हैं, ख) अपने 'सुरक्षित' इंटरनेट ट्रैफ़िक को सुनें और इसे डिकोड करने में सक्षम हों, ग) इंटरनेट पर आपके और अन्य पक्षों के बीच बहाना।

यही कारण है कि जहां सच यादृच्छिकता (यानी अनुमान लगाने में सक्षम नहीं / गणना की जा रही है) की आवश्यकता है।


10

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

कुछ लोग मुझ पर विश्वास नहीं करेंगे कि यह यादृच्छिक संख्याओं के समान रूप से वितरित होने के साथ भी संभव था, लेकिन यदि आप अनुक्रम (1, 3, 5, 2, 4, 1, 3, 5, 2, 4) को देखें तो यह संभव है। ...) जहां दो संख्याओं में से दूसरा प्रायिकता 0.6 से बड़ा है।

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


8

संक्षिप्त उत्तर यह है कि आमतौर पर लोगों को एक बुरे कारण के लिए "सच्ची यादृच्छिकता" की आवश्यकता होती है, अर्थात उन्हें क्रिप्टोग्राफी की कोई समझ नहीं है।

क्रिप्टोग्राफिक प्रिमिटिव जैसे स्ट्रीम सिफर और CSPRNG का उपयोग अप्रत्याशित बिट्स की विशाल धाराओं का उत्पादन करने के लिए किया जाता है, जब उन्हें कुछ अप्रत्याशित बिट्स खिलाया जाता है।

सावधान पाठक को अब समझ आ गया होगा कि यहां बूटस्ट्रैपिंग मुद्दा है: हमें यह सब शुरू करने के लिए एन्ट्रापी के कुछ बिट्स इकट्ठा करने होंगे। फिर उन्हें एक CSPRNG को खिला सकते हैं जो बदले में हमें उन सभी अप्रत्याशित बिट्स को खुशी से प्रदान करेगा जो हमें चाहिए। इस प्रकार एक CSNNG को सीड करने के लिए एक हार्डवेयर RNG की आवश्यकता होती है । यह एकमात्र ऐसा मामला है जहां सच्चाई में एन्ट्रापी की आवश्यकता होती है।

(मुझे लगता है कि इसे सुरक्षा या क्रिप्टोग्राफी में पोस्ट किया जाना चाहिए था।)

संपादित करें: अंत में, किसी को एक यादृच्छिक संख्या जनरेटर का चयन करना चाहिए जो कि कल्पना किए गए कार्य के लिए पर्याप्त है और जहां तक ​​यादृच्छिक संख्या पीढ़ी का संबंध है, हार्डवेयर आवश्यक रूप से अच्छे की बराबरी नहीं करता है। खराब PRNG की तरह, हार्डवेयर यादृच्छिक स्रोतों में आमतौर पर पूर्वाग्रह होते हैं।

संपादित करें: यहां कुछ लोग एक खतरे का मॉडल मानते हैं जिसमें एक हमलावर एक CSPRNG की आंतरिक स्थिति को पढ़ सकता है और वहां से इस निष्कर्ष पर जाता है कि CSPRNG एक सुरक्षित समाधान नहीं है। यह घटिया धागा मॉडलिंग का एक उदाहरण है। यदि कोई हमलावर आपके सिस्टम का मालिक है, तो खेल खत्म हो चुका है, सादा और सरल है। इस बात से कोई फर्क नहीं पड़ता है कि आप इस बिंदु पर TRNG या CSPRNG का उपयोग करते हैं या नहीं।

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

संपादित करें: सुरक्षित रैंडम नंबर जनरेशन की समस्या को समझने के लिए तैयार किसी को भी इसे पढ़ना चाहिए: http://www.cigital.com/whitepapers/dl/The_Importance_of_Reliable_Randomness.pdf


2
जरूरी नहीं कि यह सुरक्षा का सवाल हो। मुझे लगता है कि वास्तव में यादृच्छिक संख्याओं का उपयोग करने के कारण हैं जो सुरक्षा को शामिल नहीं करते हैं। यदि मैं कुछ वैज्ञानिक अनुसंधान कर रहा था जो यादृच्छिक संख्याओं पर निर्भर करता है और यह जो भी कारण के लिए महत्वपूर्ण था कि संख्याएँ यथासंभव यादृच्छिक होती हैं, मैं निश्चित रूप से एक हार्डवेयर RNG का लाभ उठाता हूं ताकि मैं आश्वस्त रह सकूं कि किसी भी गुण का अवलोकन नहीं किया गया है। आरएनजी की quirks करने के लिए।
केफ़ Schecter

3
@KefSchecter यह उनके सुना हार्डवेयर PRNGs आम तौर पर पक्षपाती और / या सहसंबद्ध उत्पादन है। उन्हें एक समान स्वतंत्र आउटपुट में बदलने के लिए पोस्ट प्रोसेसिंग कदम की आवश्यकता होती है। यह मानने का कोई कारण नहीं है कि यह पोस्ट प्रोसेसिंग कदम एक आधुनिक स्ट्रीम सिफर से अधिक विश्वसनीय है। मुझे निश्चित रूप से स्ट्रीम सिफर पर अधिक भरोसा होगा। एक अतिरिक्त बोनस के रूप में यह प्रतिलिपि प्रस्तुत करने योग्य है, जो विज्ञान में मूल्यवान है।
कोडइन्चोस

ठीक है पर्याप्त ठीक है। लेकिन क्रिप्टोग्राफी अनुप्रयोगों के लिए समान रूप से लागू नहीं होगा? यहां तक ​​कि उत्तर में यह भी कहा गया है कि आपको CSPRNG को सीड करने के लिए एक हार्डवेयर RNG की आवश्यकता है।
केफ शेक्टर

2
@KefSctcter हां, CSPRNG को बीजित करने के लिए क्रिप्टो अनुप्रयोगों को सही यादृच्छिक संख्या की आवश्यकता होती है। लेकिन बाकी सभी चीजों के लिए हम उस CSPRNG का उपयोग कर सकते हैं।
कोडइन्चोएज

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

7

सभी उपयोगों के लिए सभी PRNG उपयुक्त नहीं हैं। उदाहरण के लिए, Java.util.SecureRandom SHA1 हैश का उपयोग करता है, जिसका आउटपुट आकार 160 बिट है। इसका मतलब है कि यादृच्छिक संख्याओं की 2 160 संभव धाराएं हैं जो इससे आ सकती हैं। इतना ही आसान। आपको आंतरिक स्थिति के 2 160 से अधिक मान नहीं मिल सकते हैं । इस प्रकार आप एक एकल बीज से यादृच्छिक संख्याओं के 2 160 से अधिक अद्वितीय धाराएं प्राप्त नहीं कर सकते , कोई फर्क नहीं पड़ता कि आपका बीज कहां से आया है। माना जाता है कि विंडोज CryptGenRandom 40-बाइट राज्य का उपयोग करता है, इसमें यादृच्छिक संख्याओं की 2 320 संभावित धाराएँ हैं।

एक मानक 52-कार्ड डेक को फेरबदल करने के तरीकों की संख्या 52 है!, जो लगभग 2 226 है । इस प्रकार, बीजारोपण की परवाह किए बिना, आप कार्डों के डेक को फेरबदल करने के लिए Java.util.SecureRandom का उपयोग नहीं कर सकते थे। लगभग 2 66 संभावित फेरबदल हैं जो इसका उत्पादन नहीं कर सकते हैं। बेशक, हम नहीं जानते कि वे कौन से हैं ...

इसलिए, अगर मेरे पास स्रोत था, तो कहिए, 256-बिट्स ट्रू रैंडमनेस (जैसे, एक क्वांटिस RNG कार्ड से), मैं उस बीज के साथ एक PRNG को CryptGenRandom () की तरह सीड कर सकता था और फिर PRNG का उपयोग करके डेक का फेरबदल कर सकता था। पत्ते। अगर मैं प्रत्येक फेरबदल के साथ सच्ची यादृच्छिकता का सामना करता हूं, तो यह ठीक होगा: अप्रत्याशित और सांख्यिकीय रूप से यादृच्छिक। अगर मैंने Java.util.SecureRandom के साथ यही काम किया, तो ऐसे फेरबदल होंगे जो संभवतः उत्पन्न नहीं हो सकते, क्योंकि यह 256 बिट्स एन्ट्रापी के साथ नहीं लगाया जा सकता है, और इसकी आंतरिक स्थिति सभी संभावित फेरबदल का प्रतिनिधित्व नहीं कर सकती है।

ध्यान दें कि java.util.SecureRandom परिणाम अप्रत्याशित और सांख्यिकीय दोनों यादृच्छिक होंगे। कोई सांख्यिकीय परीक्षण कभी किसी समस्या की पहचान नहीं करेगा! लेकिन RNG का आउटपुट कार्ड के डेक का अनुकरण करने के लिए आवश्यक सभी संभावित आउटपुट के पूर्ण डोमेन को कवर करने के लिए पर्याप्त नहीं है।

और याद रखें, अगर आप इसमें जोकर जोड़ते हैं, तो यह 54 है! आप को कवर करने के, जिसके बारे में 2 की आवश्यकता है कि 238 संभावनाओं।


2
आप क्यों परवाह करते हैं कि कुछ फेरबदल नहीं हो सकता है? उस प्रतिबंध का कोई अवलोकन प्रभाव नहीं है।
कोडइन्चोस

2
मैं इस सवाल पर हलक में हूँ। भारी-विनियमित गेमिंग कंपनियों के लिए, इस तरह के पूर्वाग्रह गणितीय रूप से साबित करेंगे कि कार्ड गेम जीतने की संभावना कंप्यूटर के साथ ताश के पत्तों की तुलना में अलग है। इससे कोई फर्क नहीं पड़ता कि संभावनाएं बेहतर हैं या बदतर। वे अलग हैं। कंप्यूटर नैतिक रूप से एक वास्तविक डेक के बराबर नहीं है। इसके अलावा हम अंतर को चिह्नित नहीं कर सकते। कठोर विनियामक जुर्माना का सामना करने वाली गेमिंग कंपनी बहुत परवाह करेगी।
पैको होप

1
लेकिन यह पता लगाने योग्य है। मैं एक ज्ञात प्रक्रिया का उपयोग करके इसका पता लगाता हूं: स्रोत कोड की समीक्षा और समस्या डोमेन का ज्ञान। जो उल्लेखनीय है। मैं स्वचालित सांख्यिकीय विश्लेषण का उपयोग नहीं कर सकता। यह java.util.Random या Mersenne Twister का उपयोग करने वाले व्यक्ति के रूप में पता लगाने योग्य है। सांख्यिकीय विश्लेषण RNG / समस्या डोमेन बेमेल के लिए एकमात्र मान्य पहचान तंत्र नहीं है। असफलताएँ जो उस डिटेक्टर से गुजरती हैं, परिभाषा के अनुसार, सफल नहीं होती हैं।
पैको होप

1
मैं उस बयान से कभी असहमत नहीं हुआ। मैंने जो कहा है वह यह है कि सांख्यिकीय विश्लेषण अचूक प्रमाण नहीं है कि RNG / PRNG सही है। यह एक झूठी नकारात्मक का एक उदाहरण है। यह गलत होना चाहिए, लेकिन सांख्यिकीय आउटपुट परीक्षण इसे पारित करेगा। अगर मैं SHA1 (1), SHA1 (2), SHA1 (3) ... SHA1 (n) को मेरे "RNG" के रूप में उपयोग करता हूं जो सांख्यिकीय परीक्षण भी पास करेगा। यह भी गलत है। सही की परिभाषा "सांख्यिकीय परीक्षणों से गुजरती है" की परिभाषा से परे फैली हुई है। सांख्यिकीय परीक्षण उत्तीर्ण करना आवश्यक है, लेकिन पर्याप्त नहीं है।
पैको होप

4
@CodesInChaos: तर्क "हमें एक ऐसे हमले का पता नहीं है जो इस तथ्य का लाभ उठा सकता है कि संभव-आईआरएल-शफ़ल का विशाल बहुमत कभी भी उत्पन्न नहीं होगा" इसका मतलब यह नहीं है कि ऐसा हमला असंभव है, बस हम डॉन 'यह नहीं जानते कि यह क्या है या इसके खिलाफ कैसे बचाव किया जाए। उस मामले में सही रवैया हालत को खत्म करके हमले की संभावना को खत्म करना है: पर्याप्त गुणवत्ता का एक आरएनजी बनाएं जो वास्तव में हर संभव डेक उत्पन्न कर सकता है।
एरिक लिपर्ट

6

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


6

"सच" यादृच्छिक और "छद्म" यादृच्छिक संख्या के बीच का अंतर भविष्यवाणी है। यह उत्तर पहले ही प्रदान किया जा चुका है।

हालाँकि, भविष्यवाणी की आवश्यकता नहीं है कि एक बुरी बात है जैसे अधिकांश उदाहरण दिखा रहे हैं। यहां उन दुर्लभ मामलों में से एक का व्यावहारिक उदाहरण दिया गया है जहां भविष्यवाणी की क्षमता अच्छी है: ग्लोबल पोजिशनिंग सिस्टम।

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


2

यादृच्छिकता की तेजी से जांच के लिए, आप यादृच्छिक निर्देशांक के साथ अंक लेते हैं [0; 1) फिर उन्हें के-आयामी क्यूब में रखें। फिर आप इस क्यूब को उप-क्यूब्स में स्लाइस करने की प्रक्रिया करते हैं - सबक्र्यूब (या सबस्फीयर) के प्रत्येक वॉल्यूम को इस प्रक्रिया द्वारा अच्छी तरह से ज्ञात प्रमेय के अनुसार उतार-चढ़ाव के साथ सही ढंग से मापा जाना चाहिए।

यादृच्छिकता की गुणवत्ता महत्वपूर्ण है जहाँ आप मिलते हैं ...

  1. सुरक्षा के उद्देश्य। जब आप अपनी मुख्य पीढ़ी के लिए पैरामीटर के रूप में उपयोग करने के लिए संख्या उत्पन्न करते हैं, और यह अच्छी तरह से अनुमान लगाने योग्य है - दुश्मन इसे 100% संभावना के साथ पता लगाएगा और खोज को बहुत छोटा बना देगा।

  2. वैज्ञानिक उद्देश्य। विज्ञान में आपको न केवल अच्छी स्थिति में औसत मतलब होना चाहिए, बल्कि विभिन्न यादृच्छिक संख्याओं के बीच संबंध भी समाप्त होने चाहिए। इसलिए यदि आप (a_i - a) (a_ {i + 1} -a) लेते हैं और उसका वितरण पाते हैं तो यह आँकड़ों के अनुरूप होना चाहिए।

जोड़ी सहसंबंध को "कमजोर यादृच्छिकता" कहा जाता है। यदि आप वास्तविक यादृच्छिकता चाहते हैं, तो आपके पास 2 से अधिक भिन्नताओं के साथ उच्च क्रम सहसंबंध होना चाहिए।

आज केवल क्वांटम यांत्रिकी जनरेटर सही यादृच्छिकता प्रदान करते हैं।


1

सच्ची यादृच्छिकता महत्वपूर्ण क्यों है?

असली यादृच्छिकता के मूल रूप से दो मुख्य कारण हैं:

  1. यदि आप क्रिप्टोग्राफी के लिए RNG का उपयोग कर रहे हैं (जिसमें असली-पैसे के जुए और लॉटरी चलाने जैसी चीजें भी शामिल हैं), तो एक PRNG आपको इसके गणितीय विश्लेषण (जो TRNG मान लेता है) की तुलना में बहुत कमजोर बना देगा। PRNG वास्तव में यादृच्छिक नहीं होगा, लेकिन एक पैटर्न है - विरोधी एक सिफर दरार करने के लिए पैटर्न का फायदा उठा सकते हैं जो कि बिना दरार के होना चाहिए था।
  2. यदि आप बग परीक्षण या सिमुलेशन के लिए "यादृच्छिक" इनपुट का अनुकरण करने के लिए RNG का उपयोग कर रहे हैं, तो एक PRNG आपके दृष्टिकोण को कमजोर बनाता है। जब आप कोई बग नहीं खोजते हैं, तो हमेशा यह संदेह होता है: क्या कोई ऐसा बग है जो मेरे PRNG पैटर्न के साथ ध्यान देने योग्य नहीं है, लेकिन अगर मैं केवल TRNG का उपयोग करता हूं तो यह दिखाई देगा? क्या मेरे सिमुलेशन की खोज वास्तविकता का सटीक वर्णन करती है, या क्या मैंने PRNG के पैटर्न की एक कलाकृति की खोज की है?

इन क्षेत्रों के बाहर, यह वास्तव में कोई फर्क नहीं पड़ता। कैविएट: यदि आपका PRNG बहुत, बहुत खराब है, तो यह अभी भी अनुपयुक्त हो सकता है - आप एक क्रेप्स गेम नहीं बनाना चाहते हैं जहां पासा हमेशा ऊपर आता है, आपके खिलाड़ी इसे पसंद नहीं करेंगे।

पाइथन का PRNG पर्याप्त नहीं है?

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

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


0

मूल रूप से, आप यह साबित नहीं कर सकते कि स्रोत आउटपुट के गणित विश्लेषण से यादृच्छिक है, आपको उदाहरण के लिए एक भौतिक मॉडल की आवश्यकता है जो कहता है कि स्रोत यादृच्छिक है (रेडियोधर्मी क्षय के रूप में)।

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

कुछ यादृच्छिकता परीक्षणों को पास करने का मतलब है कि आपके पास एक अच्छा PRNG (छद्म यादृच्छिक संख्या जनरेटर) है, जो उन अनुप्रयोगों के लिए उपयोगी हो सकता है जहां सुरक्षा शामिल नहीं है।

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

एक अच्छा PRNG होने से नए और अप्रत्याशित पैटर्न बनाने के लिए खेल में उपयोगी हो सकता है, और एन्क्रिप्शन में - एक ही पोस्ट में समझाने के लिए बहुत बोझिल, बस अंगूठे की भूमिका के रूप में सोचें कि एन्क्रिप्शन प्रक्रिया से बाहर निकलने के लिए छद्म यादृच्छिक होना चाहिए, पैटर्न नहीं दिखा रहा है जो एन्क्रिप्टेड डेटा का पालन करने के साथ पिछले एन्क्रिप्टेड डेटा से संबंधित हो सकता है, या एन्क्रिप्टेड डेटा से सादे पाठ डेटा से संबंधित हो सकता है, या दो अलग-अलग सिफरटेक्ट्स को एक-दूसरे से संबंधित कर सकता है (ताकि अनुमान सादे ग्रंथों पर बनाया जा सके) ...।


-5

लघु कथा:

सिस्टम के वर्तमान माइक्रोसेकंड का उपयोग करके एक यादृच्छिक बीज उत्पन्न करता है।

यह चाल काफी पुरानी है और अभी भी क्रियाशील है।

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

चलो एक उदाहरण कहते हैं, मैं केवल 10 मूल्यों का उपयोग करके उपयोग किए गए बीज को निर्धारित कर सकता हूं। इसलिए, बीज को जानकर, मैं अगले मूल्य का अनुमान लगा सकता हूं।

यदि मैं बीज = 1 का उपयोग करता हूं तो मैं अगला अनुक्रम प्राप्त कर सकता हूं:

1, 2, 3, 4, 5, 6, 7, 8, 9 ... (और मैं कटौती करता हूं कि बीज ने आईडी 1 और अगले मूल्य 10 का इस्तेमाल किया)

लेकिन, अगर हर "एनटी" मूल्यों को बदल दिया जाए तो क्या होगा? वर्तमान माइक्रोसेकंड द्वारा बीज को बदलना एक सस्ती चाल है (अर्थात, इसे कई सीपीयू चक्रों की आवश्यकता नहीं है)।

तो अनुक्रम अब है: (बीज = 1) 1, 2, 3, 4, 5, (बीज = 2), 7, 9, 11, 13 ... (15?)

इस मामले में:

a) मैं यह नहीं घटा सकता कि किस बीज का उपयोग किया गया था।

बी) एर्गो, मैं अगले मूल्य का अनुमान नहीं लगा सकता।

ग) एकमात्र अनुमान जो मैं कर सकता हूं वह यह है कि अगले बीज एक बड़ी संख्या हो सकती है।

वैसे भी, अधिकांश आधुनिक यादृच्छिक जनरेटर एल्गोरिदम पहले से ही हुड के तहत इस चाल का उपयोग करते हैं।

सही तथ्य यह है कि, हमें "सही" रैंडम संख्या बनाने के लिए क्वांटम कंप्यूटर की आवश्यकता नहीं है, हमारे कंप्यूटर के क्वार्ट्ज क्रिस्टल की खराबी एक यादृच्छिक जनरेटर के रूप में कार्य करती है, हमारे सीपीयू की यादृच्छिक दक्षता भी बिना सोचे समझे परिवर्तनशील है। सीपीयू आमतौर पर एक ही समय में कई कार्य करता है।


2
यह एक बुरा विचार है और यह उस चीज़ के लिए भेद्यता का एक स्रोत है, जिसके लिए त्रिकोणीय अप्रत्याशित अनुक्रम की आवश्यकता होती है। यदि आप माइक्रोसेकंड लेते हैं, तो आपके पास बीज की केवल 10 ^ 6 संभावनाएं हैं जो कम है।
HoLyVieR

@HoLyVieR: यह निश्चित रूप से एक बुरा विचार है यदि आप सुरक्षा की परवाह करते हैं, लेकिन उतना बुरा नहीं है जितना आप बाहर करते हैं: आप आमतौर पर सिस्टम शुरू होने (या यूनिक्स एपोच ....) के बाद से माइक्रोसेकंड का उपयोग करेंगे, जो संभावित मूल्यों की सीमा को बढ़ाता है।
मिकेरा

1
@ मिकेरा यह कोई बेहतर नहीं है, जिस समय अनुरोध को संसाधित किया गया था वह पूर्वानुमान योग्य है। यह पासवर्ड रीसेट कार्यक्षमता की एक अच्छी संख्या के लिए भेद्यता का एक वेक्टर है। उन स्क्रिप्ट ने आपकी तकनीक के साथ "यादृच्छिक" टोकन उत्पन्न किया और हमलावर उस समय से ढूंढने के बाद उत्पन्न टोकन पा सकता है जिस पर इसे निष्पादित किया गया था बल्कि तुच्छ है ... यह वही समय है जब पासवर्ड रीसेट के लिए अनुरोध भेजा गया था + - 150ms।
HoLyVieR

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

ऑनलाइन सर्वर के लिए, सिस्टम अपटाइम जानकारी कभी-कभी सार्वजनिक रूप से पेश की जाती है। या आप इसे एक स्थिति पेज "इंसिडेंट्स। सर्वर अप फिर से" से प्राप्त कर सकते हैं। या आप पिंग कर सकते हैं, एक बड़े डाउनटाइम की प्रतीक्षा करें, और ध्यान दें कि यह एक मशीन रिबूट हो सकता है (जो कि जांच के लिए कुछ सैकड़ों लाखों समय देगा, जो कम है)।
डेरेकसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.