मैंने सुना है कि कंप्यूटर में यादृच्छिक संख्या पीढ़ी वास्तव में यादृच्छिक नहीं है, लेकिन इसका पता लगाने के लिए कोई कुशल एल्गोरिदम नहीं है। इसका पता कैसे लगाया जा सकता है?
मैंने सुना है कि कंप्यूटर में यादृच्छिक संख्या पीढ़ी वास्तव में यादृच्छिक नहीं है, लेकिन इसका पता लगाने के लिए कोई कुशल एल्गोरिदम नहीं है। इसका पता कैसे लगाया जा सकता है?
जवाबों:
कंप्यूटर वास्तव में यादृच्छिक होने के नाते:
सैद्धांतिक रूप से ट्यूरिंग मशीनों के लिए सही यादृच्छिकता असंभव है, और अधिकांश कंप्यूटर वास्तव में यादृच्छिक आउटपुट उत्पन्न नहीं कर सकते हैं। इसलिए, कुछ आधुनिक कंप्यूटर में हार्डवेयर शामिल होते हैं जो कंप्यूटर को एक बाहरी स्रोत तक पहुंचने की अनुमति देता है जो उम्मीद है कि कुछ यादृच्छिकता शामिल होगी। यह कैसे पूरा किया जा सकता है इसका एक उदाहरण कंप्यूटर के अंदर तापमान में छोटे उतार-चढ़ाव को ट्रैक करना है। यादृच्छिकता एक बाहरी स्रोत से भी प्राप्त की जा सकती है। लेकिन आपके पोस्ट के लहजे से मुझे नहीं लगता कि यादृच्छिकता के बाहर के स्रोत वही हैं जो आप में रुचि रखते हैं।
बीज:
एक बाहरी जोड़ के बिना, कंप्यूटर जो कुछ भी करता है वह नियतात्मक होता है। इससे एक बड़ा मुद्दा बनता है: यदि आप एक यादृच्छिक संख्या पीढ़ी कार्यक्रम कहते हैं, तो यह आपको हर बार एक ही परिणाम देगा यदि आप इसे एक ही इनपुट देते हैं। स्पष्ट रूप से, हमें एक ऐसे कार्यक्रम की आवश्यकता होती है जो प्रत्येक बार चलने वाले व्यवहार को बदलने के लिए एक यादृच्छिक संख्या को आउटपुट करता है (अन्यथा हम उसी "यादृच्छिक" संख्या को प्राप्त करते रहेंगे, जो विशेष रूप से उपयोगी नहीं है)। एक विचार कार्यक्रम को कुछ इनपुट देना है, जो हर बार कार्यक्रम को चलाने के लिए बदलता है, ताकि एक अलग संख्या आउटपुट हो। हम इस इनपुट को "बीज" कहते हैं। यादृच्छिक संख्या जनरेटर को एक बीज में लेने, कुछ ऑपरेशन करने और हमें एक यादृच्छिक संख्या देने की आवश्यकता है।
वर्तमान प्रणाली का समय एक बीज का एक उत्कृष्ट उदाहरण है। यह उच्च एन्ट्रापी के साथ एक लंबी स्ट्रिंग देता है, और यदि समय को पर्याप्त रूप से बारीक ढंग से ट्रैक किया जाता है (अर्थात यदि आपका सिस्टम घड़ी घंटों का उपयोग करता है, तो "समय" एक बहुत खराब बीज है), आप छद्म आयामी संख्या को खिलाने की संभावना नहीं रखते हैं। दो बार एक ही नंबर जनरेटर।
एल्गोरिदम जो रैंडम पर्याप्त हैं:
अब हमारे पास एक एल्गोरिथ्म है जो कम से कम प्रत्येक बार चलने के लिए अलग-अलग होने का कोई रास्ता है। हम इसे एक बीज देते हैं, और जबकि एल्गोरिथ्म एक ही नंबर देता है जब उसी बीज के साथ संकेत दिया जाता है, हम चाहते हैं कि यह संख्या अन्यथा यादृच्छिक हो। यह ऊपर की तरह काम करता है - आप कुछ इनपुट में लेते हैं, और यह कुछ (उम्मीद है कि इनपुट से काफी अलग है "यादृच्छिक") आउटपुट।
अब कहते हैं कि आप ऐसा करने के लिए अपने स्वयं के एल्गोरिदम के साथ आए थे, और आप दावा करते हैं कि आपके द्वारा आए नंबर बहुत ही यादृच्छिक के करीब हैं जब आपने इसे विभिन्न बीजों का एक गुच्छा दिया था। हम कैसे परीक्षण करेंगे कि यह कितना अच्छा है?
अब हम कुछ एल्गोरिदम चाहते हैं जो एक बीज में ले जाएगा, कुछ ऑपरेशन करेगा, और एक यादृच्छिक संख्या का उत्पादन करेगा। सरलतम पर, एल्गोरिथ्म सिर्फ बीज का उत्पादन कर सकता है - यह हमें हर बार एक ही नंबर नहीं दे रहा है, और यादृच्छिक बीज हमें यादृच्छिक आउटपुट देते हैं। लेकिन स्पष्ट रूप से वह नहीं है जो हम चाहते हैं। दूसरी ओर, एक एल्गोरिथ्म काफी जटिल हो सकता है, जैसे कई वास्तविक छद्म आयामी जनरेटर। हम कैसे बता सकते हैं कि कौन से एल्गोरिदम हमें अपने नहीं-जरूरी-यादृच्छिक बीज से "यादृच्छिक" नंबर देते हैं? यदि हम इसे ठीक से प्राप्त नहीं कर सकते हैं, तो हम कैसे बता सकते हैं कि कौन से सर्वश्रेष्ठ हैं?
यह बताना मुश्किल है कि उनमें से कौन सा परीक्षण आदर्श है, लेकिन इन एल्गोरिदम को पूरा करने में कुछ न्यूनतम आवश्यकताओं के साथ आना आसान है, इससे पहले कि हम उन्हें "यादृच्छिक" संख्या दें। हो सकता है कि हम यह सुनिश्चित करना चाहते हैं कि आपका एल्गोरिथ्म भी आधे समय में नंबर दे। शायद हम यह सुनिश्चित करना चाहते हैं कि अगर मैं बीच यादृच्छिक संख्या के लिए पूछूं , तो उस सीमा के सभी नंबर आपके फ़ंक्शन के लिए कुछ इनपुट के लिए आउटपुट होंगे। स्पष्ट रूप से बहुत सारे परीक्षण हैं जो हम चला सकते हैं; यदि आपका एल्गोरिथ्म परीक्षण के कुछ सुइट से गुजरता है तो यह एक छद्म आयामी जनरेटर है। कंप्यूटर विज्ञान का एक बहुत ही रोचक और अच्छी तरह से उपयोग किया जाने वाला / अध्ययन किया गया क्षेत्र है।
एक हमलावर को बेवकूफ बनाने के लिए रैंडम पर्याप्त:
अब आप जिस बात का जिक्र कर रहे हैं वह है क्रिप्टोग्राफीली सिक्योर स्यूडॉरजैंडम जनरेटर्स। मुझे लगता है कि यह समझाने का सबसे अच्छा तरीका ऊपर के संदर्भ में है - यहां, हम क्रिप्टोग्राफी के लिए अपनी यादृच्छिकता का उपयोग कर रहे हैं, इसलिए जब हम परीक्षण डिजाइन कर रहे हैं जो हम वास्तव में परवाह करते हैं कि कोई तोड़ नहीं पाएगा हमारी सुरक्षा की भविष्यवाणी करके कि हमने कौन सा यादृच्छिक नंबर उठाया। मुझे क्रिप्टोग्राफी के साथ आपके परिचित स्तर का पता नहीं है, लेकिन कल्पना करें कि हम एक सरल प्रतिस्थापन साइबरफेयर कर रहे हैं --- प्रत्येक अक्षर को किसी अन्य अक्षर से बदल दिया जाता है। हम इन प्रतिस्थापनों को बेतरतीब ढंग से चुनना चाहते हैं, इसलिए वे एक हमलावर के लिए अनुमान लगाना कठिन हैं। लेकिन अगर वह पता लगा सकता है कि मेरा यादृच्छिक संख्या जनरेटर कैसे काम करता है, तो वह पूरे सिफर को हल करने में सक्षम होगा! इसलिए, क्रिप्टोग्राफिक एल्गोरिदम को यादृच्छिक संख्या जनरेटर की आवश्यकता होती है जो विशेष रूप से अनुमान लगाने में कठिन होते हैं।
इस कारण से, CSPRG को परिभाषित किया जाता है कि अन्य एल्गोरिदम उन्हें कितनी अच्छी तरह से हल करते हैं (जो कि आखिरकार हम आपके सवाल पर आते हैं)। विशेष रूप से, मान लें कि मेरे पास एक CSPRG है जिसे मैं R. R कहूंगा कि एक CSPRG है अगर और केवल अगर कोई संभव एल्गोरिथ्म नहीं है जो अनुमान लगा सकता है कि यह किस बिट के आगे उत्पादन करेगा। यह सच है भले ही आप सभी पिछले बिट्स यह उत्पादन पता है!
तो चलिए बताते हैं कि मेरे CSPRG के पहले पांच बिट्स 10100 आउटपुट हैं। आप प्रोग्राम के लिए मेरे द्वारा उपयोग किए गए इनपुट को नहीं जानते हैं, लेकिन आपके पास उस कोड तक पहुंच है जिसका उपयोग मैंने अपना CSPRG लिखने के लिए किया था। फिर दावा है कि यह तय करना आपके लिए असंभव है कि अगला बिट आउटपुट 101000 या 101001 होगा या नहीं।
तो क्रिप्टोग्राफी के कारणों के लिए, कभी-कभी एक छद्म आयामी संख्या जनरेटर कितनी अच्छी तरह से परिभाषित किया जाता है कि यह अन्य कार्यक्रमों के लिए कितना अनुमानित है। ध्यान दें कि यह अभी भी "यादृच्छिकता" का बहुत अंतर्ज्ञान देता है, जैसा कि (कहते हैं) यदि आप जानते हैं कि सभी यादृच्छिक आउटपुट विषम होंगे तो यह न तो क्रिप्टोग्राफिक रूप से सुरक्षित है और न ही यह सामान्य-ज्ञान यादृच्छिकता परीक्षण पास करता है।
हाल ही में मुझे MIT CSAIL थ्योरी ऑफ़ कम्प्यूटेशन ग्रुप ब्लॉग पर गणना में यादृच्छिकता के बारे में एक अच्छी पोस्ट मिली: क्या आप बता सकते हैं कि क्या बिट यादृच्छिक है?
पोस्ट की शुरुआत कुछ विचारों से होती है जो एवी विगडरसन की शक्ति और कम्प्यूटेशन में यादृच्छिकता की सीमाओं के बारे में अद्भुत बात करते हैं, यादृच्छिक एल्गोरिदम के सुंदर क्षेत्र का सर्वेक्षण करते हैं, और छद्म आयामीता और कम्प्यूटेशनल इंट्रेक्टेबिलिटी के बीच आश्चर्यजनक संबंध ।
फिर यह क्वांटम क्रिप्टोग्राफी पर कुछ हालिया परिणामों को संक्षेप में प्रस्तुत करता है; विशेष रूप से कुशलतापूर्वक परीक्षण करने का तरीका यदि एक निश्चित प्रकार के डिवाइस का आउटपुट वास्तव में यादृच्छिक (यादृच्छिकता विस्तार प्रोटोकॉल) है।
उदाहरण के लिए उमेश वज़ीरानी, थॉमस विडिक, सर्टिफ़ाइबल क्वांटम डाइस (या, परीक्षण योग्य घातीय यादृच्छिकता विस्तार) द्वारा हालिया कार्य देखें
सार: हम एक प्रोटोकॉल पेश करते हैं जिसके माध्यम से ओ (लॉग एन) वर्दी बिट्स के एक बीज से वास्तविक यादृच्छिकता के एन बिट्स उत्पन्न करने के लिए क्वांटम मैकेनिकल उपकरणों की एक जोड़ी का उपयोग किया जा सकता है। जेनरेट किए गए बिट्स केवल एक साधारण सांख्यिकीय परीक्षण के आधार पर प्रमाणिक रूप से यादृच्छिक होते हैं जो उपयोगकर्ता द्वारा किए जा सकते हैं, और इस धारणा पर कि डिवाइस नो-सिग्नलिंग सिद्धांत का पालन करते हैं। उपकरणों के आंतरिक कामकाज पर कोई अन्य धारणा नहीं रखी गई है ...।
मान लें कि आप सांख्यिकीय यादृच्छिकता के बारे में बात कर रहे हैं - क्रिप्टोग्राफी की अन्य आवश्यकताएं हैं! - अच्छाई के फिट परीक्षणों की एक पूरी श्रृंखला है जो यह पता लगा सकती है कि संख्याओं का एक क्रम किसी दिए गए वितरण पर फिट बैठता है या नहीं। आप यह जांचने के लिए उपयोग कर सकते हैं कि क्या एक (छद्म) यादृच्छिक संख्या जनरेटर ध्वनि है (आपके परीक्षण की गुणवत्ता और चुने हुए महत्व तक)।
डायनहार्ड टेस्ट सूट अलग-अलग तरीकों को जोड़ते हैं।
यह कंप्यूटर विज्ञान में एक व्यापक / जटिल विषय है जिसे सैमएम द्वारा अन्य उत्तर कुछ को संबोधित करता है। आपका विशिष्ट प्रश्न इस बारे में प्रतीत होता है कि क्या कंप्यूटर में PRNG कहा जाता है , यानी छद्म यादृच्छिक संख्या जनरेटर , तो कोई कैसे पता लगा सकता है?
संक्षिप्त उत्तर यह है कि nontrivial PRNG इसलिए बनाए गए हैं ताकि उनके एल्गोरिदम का पता नहीं लगाया जा सके (व्युत्पन्न)। सामान्य तौर पर, अगर PRNG को "सुरक्षित" कहा जाता है, भले ही किसी हमलावर को छद्म आयामी अनुक्रम उत्पन्न करने के लिए उपयोग किए जाने वाले एल्गोरिदम को पता हो, वे अनुक्रम उत्पन्न करने के लिए उपयोग किए जाने वाले विशेष मापदंडों का अनुमान नहीं लगा सकते हैं। इस तरह छद्म विज्ञान में क्रिप्टोग्राफी के कई गहरे संबंध हैं, और कोई एक PRNG को "तोड़ने" के बारे में उसी तरह से बात कर सकता है जिस तरह से एक क्रिप्टोग्राफिक एल्गोरिथ्म "टूट" सकता है। इस क्षेत्र में कई शोध पत्र हैं, इसका क्रिप्टोग्राफी में सबसे आगे एक सक्रिय क्षेत्र है।
"तुच्छ" PRNGs के लिए, उदाहरण के लिए, एक रैखिक अभिनंदन जनरेटर कहते हैं , अगर हमलावर को पता चलता है कि एल्गोरिथ्म इसे उत्पन्न करने के लिए इस्तेमाल किया गया है और यह "bignums" के साथ उत्पन्न नहीं हुआ है , तो खोज स्थान "अपेक्षाकृत छोटा" है और हमलावर सैद्धांतिक रूप से पैरामीटर भी खोज सकता है मूल रूप से जानवर बल द्वारा और विशेष रूप से सभी संयोजनों की कोशिश करके PRNG द्वारा उपयोग किया जाता है।
PRNGs को कुछ मामलों में उनके खिलाफ सांख्यिकीय यादृच्छिकता परीक्षणों के बड़े सूट को चलाकर कुछ मामलों में व्यवहार में (फिर से उनकी "सुरक्षा" के आधार पर) तोड़ा जा सकता है। उदाहरण के लिए, यह कार्यक्रम "डायनडर" (ब्राउन द्वारा) का औचित्य है । एक NIST सुइट भी है ।
PRNGs को तोड़ने की आंतरिक कठिनाई / कठोरता अभी तक सैद्धांतिक रूप से कड़ाई से सिद्ध नहीं हुई है, लेकिन मूल रूप से इसे "ट्रैपडोर" या "वन-वे फ़ंक्शंस" कहा जाता है, जो एक दिशा में कुशलता से गणना की जा सकती है, लेकिन इनवर्ट (रिवर्स) करने के लिए "हार्ड" हैं। । यादृच्छिकता कठोरता के बारे में क्रिप्टोग्राफी में कुछ खुली समस्याएं हैं। ये प्रश्न जटिलता पी श्रेणी अलगाव से निकट से संबंधित हैं जैसे प्रसिद्ध पी =? एनपी प्रश्न।
PRNG को तोड़ने के बारे में प्रश्न कोलमोगोरोव जटिलता से संबंधित हैं , एक ऐसा क्षेत्र जो सबसे छोटी ट्यूरिंग मशीनों का अध्ययन करता है जो अनुक्रम उत्पन्न कर सकता है। PRNG को तोड़ने से भी एक छद्म आयामी अनुक्रम की गणना करने के लिए "सबसे छोटा" कार्यक्रम खोजने से निकटता से संबंधित है। और कोलमोगोरोव जटिलता सामान्य रूप से गणना करने के लिए अवांछनीय है।
जैसा कि गाइल्स एक टिप्पणी में बताते हैं कि भौतिक इलेक्ट्रॉनिक प्रक्रियाओं जैसे कि क्वांटम शोर से संबंधित हार्डवेयर आधारित RNG मौजूद हैं । अगर सही ढंग से इंजीनियर अटूट हैं।
वास्तव में एक शास्त्रीय कंप्यूटर में जो कुछ भी किया जाता है वह निर्धारक होता है, इस अर्थ में कि जब आप उन्हें कुछ कार्य देते हैं तो यह उन्हें नियत रूप से अनुसरण करता है। इसलिए यदि आप एक यादृच्छिक संख्या रखना चाहते हैं, तो आप इसे समय के अनुसार गणना कर सकते हैं (उपयोगकर्ता के इनपुट समय के आधार पर), लेकिन यदि आप यादृच्छिक संख्याओं का एक सेट चाहते हैं, तो आप अगले संख्याओं के लिए समय का उपयोग नहीं कर सकते, क्योंकि संख्या अधिक स्वतंत्र नहीं होगी।
लोग ऐसा क्या करते हैं जो छद्म यादृच्छिक जनरेटर का उपयोग करते हैं जिनके पास एक बीज होता है, यानी एक संख्या जिसका उपयोग छद्म यादृच्छिक संख्या जनरेटर की सभी संख्याओं की गणना करने के लिए किया जाता है (सिमुलेशन या अन्य कार्यों के कुछ अधिक परिष्कृत मामलों में, अधिक बीज की आवश्यकता हो सकती है) , अगर स्वतंत्र रूप से यादृच्छिक संख्याओं के एक से अधिक सेट की जरूरत है)। बीज आमतौर पर 0 या एक विशिष्ट संख्या है यदि आप प्रतिलिपि प्रस्तुत करने योग्य परिणाम चाहते हैं, या समय यदि आप और अलग-अलग अप्रस्तुत परिणाम।
तथ्य यह है कि छद्म यादृच्छिक संख्या जनरेटर काफी अच्छे हैं, इस तथ्य में निहित है कि वे "छद्म यादृच्छिक संख्या पीढ़ी की बुनियादी विशेषताओं" का पालन करते हैं, ताकि कुशलता से गणना की जा सके और वास्तविक यादृच्छिक संख्याओं की तरह व्यवहार किया जा सके:
छद्म यादृच्छिक संख्याओं के अनुक्रम की प्रत्येक संख्या से एक नई संख्या की गणना की जाती है (आमतौर पर हम पूर्णांक के साथ काम करते हैं)। हालाँकि संख्याओं को व्यक्त करने के लिए उपलब्ध बिट्स की परिमित संख्या के साथ एक विशिष्ट आधार में काम करने के लिए तैयार छद्म-यादृच्छिक संख्या जनरेटर के अनुक्रम में एक अवधि, एन, है। यदि यह n पर्याप्त बड़ा नहीं होगा तो गंभीर समस्याएं होंगी, लेकिन चिंता न करें, कंप्यूटर वैज्ञानिक एक अच्छा n करने के लिए अच्छी तरह से छद्म यादृच्छिक जनरेटर के बीज और अन्य मापदंडों का चयन करते हैं।
उदाहरण के लिए, एक संभव छद्म-यादृच्छिक संख्या जनरेटर, रैखिक अभिनंदन विधि के साथ, जो कि सबसे पुराना और सबसे अच्छा पता छद्म-यादृच्छिक संख्या जनरेटर एल्गोरिदम में से एक के अनुसार परिभाषित किया जा सकता है:
इसके चार मूल्य हैं:
- x_0 ≥ 0
- एक
c 0
- c
m 0
- m> x_0, जहाँ:
x0 प्रारंभिक मान है, a, c, और m स्थिरांक हैं: m> a, m> c, और यह फ़र्नुला के साथ अनुक्रम उत्पन्न करता है:
x_ {i + 1} = (a * x_i + c) MOD m
इन स्थिरांक के मूल्यों को सावधानीपूर्वक चुना जाना चाहिए। एक संभावना है:
x_ {i + 1} = (1664525 * x_i + 1013904223) MOD 2 ^, refs। [1-2]
यादृच्छिक संख्या उत्पन्न करने के लिए अन्य एल्गोरिदम अधिक परिष्कृत हैं, जो पिछले एल्गोरिदम की कुछ समस्याओं से बचते हैं, जिनमें शामिल हैं: [3]
- कुछ बीज राज्यों के लिए अपेक्षित अवधियों से कम (ऐसे बीज राज्यों को इस संदर्भ में 'कमजोर' कहा जा सकता है);
- बड़ी संख्या में उत्पन्न संख्या के लिए वितरण की एकरूपता का अभाव;
- क्रमिक मूल्यों का सहसंबंध;
- आउटपुट अनुक्रम का खराब आयामी वितरण;
- जहाँ कुछ मान उत्पन्न होते हैं, उनके बीच की दूरी एक यादृच्छिक अनुक्रम वितरण में अलग-अलग वितरित की जाती है।
भविष्य में, शास्त्रीय कंप्यूटर क्वांटम सिस्टम के लिए एकजुट हो सकते हैं जो वास्तव में यादृच्छिक संख्या प्रदान कर सकते हैं, और उन्हें वितरित कर सकते हैं। [4]
संदर्भ:
[१] http://en.wikipedia.org/wiki/linear_congruential_generator
[२] विलियम एच।, एट अल। (1992)। "फोरट्रान 77 में संख्यात्मक व्यंजन: वैज्ञानिक कंप्यूटिंग की कला" (दूसरा संस्करण)। आईएसबीएन 0-521-43064-एक्स।
[३] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[४] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-processes-generate-truly-random-numbers /