यादृच्छिक संख्या जनरेटर म्हणजे काय?
यादृच्छिक संख्या जनरेटर (RNG) ही अशी प्रणाली आहे जी यादृच्छिक किंवा स्यूडो-रँडम संख्या तयार करते. पुढच्या संख्येचा प्रत्यक्षात अंदाज लावला जाऊ शकतो की नाही हे जनरेटरच्या प्रकारावर अवलंबून असते. काही जनरेटर भौतिक प्रक्रियेवर आधारित असतात, काही अल्गोरिदमच्या साहाय्याने संख्या मोजतात, आणि काही अल्गोरिदम अशा प्रकारे तयार केलेले असतात की ज्याने त्यांचे निकाल पाहिले आहेत तोदेखील पुढे काय येईल याचा अंदाज लावू शकत नाही. यादृच्छिक दिसणे आणि अनपेक्षित असणे हे दोन भिन्न गुणधर्म आहेत, आणि हा लेख प्रामुख्याने याच फरकावर आधारित आहे.
हार्डवेअर यादृच्छिक संख्या जनरेटर
हार्डवेअर यादृच्छिक संख्या जनरेटर (HRNG), ज्याला खरा यादृच्छिक संख्या जनरेटर (TRNG) असेही म्हणतात, तो भौतिक प्रक्रियेतून संख्या मिळवतो. यातील सर्वात जुनी साधने आपल्या डोळ्यांसमोर काम करतात: उडवलेले नाणे, टाकलेला फासा किंवा रुलेटचे चाक. मेकॅनिक्स यातील प्रत्येकाचे पूर्ण वर्णन करू शकते, तरीही एक चांगल्या प्रकारे बनवलेले चाक प्रत्यक्षात अनपेक्षितच असते, कारण प्रत्येक फिरण्याची सुरुवात कशी होते यातील सूक्ष्म बदल पूर्णपणे वेगळ्या निकालांत रूपांतरित होतात.
आधुनिक हार्डवेअर जनरेटर सूक्ष्म घटनांचे मोजमाप करतात: इलेक्ट्रॉनिक सर्किट्समधील शॉट नॉईज आणि थर्मल नॉईज, वातावरणातील नॉईज आणि क्वांटम प्रभाव. हे एन्ट्रॉपीचे — म्हणजेच मोजता येणाऱ्या अनपेक्षिततेचे — चांगले स्रोत आहेत, परंतु भौतिक स्रोत स्वभावतःच परिपूर्ण नसतो: त्यात असमानता येऊ शकते, कालांतराने त्याचे गुणधर्म बदलू शकतात किंवा तो अयशस्वी होऊ शकतो; म्हणूनच त्याच्या गुणवत्तेचे मूल्यमापन आणि निरीक्षण करावे लागते, तसेच आवश्यकतेनुसार त्याच्या निष्कर्षांवर पुढील प्रक्रिया करावी लागते, ज्याचे वर्णन NIST SP 800-90B सारख्या मानकांमध्ये केले आहे. जिथे हमी सर्वात महत्त्वाची असते तिथे हार्डवेअर स्रोत वापरले जातात — प्रामुख्याने क्रिप्टोग्राफीमध्ये, जिथे ते Transport Layer Security (TLS) सारख्या प्रोटोकॉलमागील कीजसाठी अनपेक्षित सुरुवातीचे घटक पुरवतात.
स्यूडो-रँडम संख्या जनरेटर
भौतिक उपकरणाला अल्गोरिदम हा एक पर्याय आहे. स्यूडो-रँडम संख्या जनरेटर (PRNG) असा क्रम तयार करतो जो यादृच्छिक दिसतो, परंतु तो सीड (seed) नावाच्या सुरुवातीच्या मूल्याद्वारे पूर्णपणे निर्धारित असतो. त्याच अल्गोरिदमला तेच सीड दिले तर तुम्हाला प्रत्येक वेळी अगदी तसाच क्रम मिळतो. जिथे निकाल अनपेक्षित असणे आवश्यक असते आणि जिथे सीड किंवा अंतर्गत स्थितीचा अंदाज लावला जाऊ शकतो किंवा ती पुन्हा तयार केली जाऊ शकते, तिथे ही एक कमजोरी ठरते; तर जिथे निकाल पुन्हा तयार करता येण्याजोगा असणे आवश्यक असते — जसे की सिम्युलेशन किंवा चाचणी हुबेहूब पुन्हा चालवणे — तिथे ही एक ताकद ठरते. PRNG हे वेगवान, स्वस्त आणि वापरण्यास सोपे असतात, म्हणूनच बहुतेक सॉफ्टवेअर त्यांच्यावर अवलंबून असतात. प्रसिद्ध अल्गोरिदममध्ये लिनियर कॉन्ग्रुएंशियल जनरेटर (LCG), xorshift जनरेटर आणि मेर्सेन ट्विस्टर यांचा समावेश होतो.
Mersenne Twister
माकोतो मात्सुमोतो आणि ताकुजी निशिमुरा यांनी 1997 मध्ये प्रकाशित केलेला Mersenne Twister हा सर्वाधिक वापरल्या जाणाऱ्या स्यूडो-रँडम संख्या जनरेटरपैकी एक आहे आणि अनेक प्रोग्रामिंग भाषांमध्ये तो डिफॉल्ट आहे. त्याचे नाव त्याच्या आवर्तनावरून आले आहे — म्हणजे क्रम पुनरावृत्ती होण्यापूर्वीची लांबी — जे मानक प्रकारात, MT19937 मध्ये, 219937 − 1 ही मेर्सेन मूळ संख्या आहे. तो यादृच्छिकतेच्या बहुतांश सांख्यिकीय चाचण्या उत्तीर्ण करतो आणि सिम्युलेशनसाठी योग्य आहे. मात्र, तो गुपिते सुरक्षित ठेवण्यासाठी तयार केलेला नव्हता: सलग 624 32-bit निकालांवरून कोणीही त्याची अंतर्गत स्थिती पुन्हा तयार करू शकते आणि त्यानंतर येणाऱ्या प्रत्येक मूल्याचा अंदाज लावू शकते, म्हणूनच कीज, पासवर्ड किंवा इतर कोणत्याही गोष्टीसाठी तो वापरला जाऊ नये ज्या अनपेक्षित राहणे आवश्यक आहे.
क्रिप्टोग्राफिकदृष्ट्या सुरक्षित जनरेटर आणि एन्ट्रॉपी
अनेक ॲप्लिकेशन्सना एकाच वेळी दोन्ही गोष्टींची गरज असते: अल्गोरिदमचा वेग आणि भौतिक स्रोताची अनपेक्षितता. याचे उत्तर म्हणजे क्रिप्टोग्राफिकदृष्ट्या सुरक्षित स्यूडो-रँडम संख्या जनरेटर (CSPRNG). हादेखील एक PRNG च आहे, परंतु तो अशा प्रकारे बनवला गेला आहे की त्याच्या आउटपुटचा काही भाग पाहिल्याने उर्वरित भागाचा अंदाज लावण्याचा कोणताही व्यावहारिक मार्ग मिळत नाही; तसेच त्याला खऱ्या एन्ट्रॉपीच्या स्रोतातून सीड दिले जाते आणि नियमितपणे रीसीड केले जाते. भौतिक स्रोताकडून मिळालेले सीड सामान्य PRNG ला सुरक्षित बनवत नाही; अल्गोरिदमच त्यासाठी तयार केलेला असावा लागतो. थर्मल नॉईज किंवा हार्डवेअर घटनांची वेळ यांसारखा भौतिक स्रोत कमी प्रमाणात खरी यादृच्छिकता पुरवतो आणि CSPRNG त्यातून खूप वेगाने मूल्यांचा लांब क्रम तयार करतो. हेच संयोजन ऑपरेटिंग सिस्टम त्यावर चालणाऱ्या प्रोग्राम्सना उपलब्ध करून देते, आणि आज व्यवहारात "यादृच्छिक संख्या जनरेटर" चा हाच खरा अर्थ असतो. ते एन्क्रिप्शन कीज, सेशन टोकन्स आणि पासवर्ड तयार करते.
ब्राउझरमध्ये यादृच्छिक संख्या
JavaScript वेब पेजला यादृच्छिक मूल्ये मिळवण्याचे दोन इनबिल्ट मार्ग देते आणि ते वेगवेगळ्या वर्गातील आहेत. Math.random() हा एक सामान्य PRNG आहे: भाषेचे मानक अल्गोरिदम प्रत्येक ब्राउझरवर सोपवते आणि सुरक्षिततेबद्दल कोणतीही हमी देत नाही — हे ॲनिमेशनसाठी ठीक आहे, पण कोणी आक्षेप घेऊ शकेल अशा सोडतीसाठी अयोग्य आहे. दुसरा मार्ग म्हणजे Web Crypto API. त्याची crypto.getRandomValues() पद्धत क्रिप्टोग्राफिकदृष्ट्या मजबूत यादृच्छिक मूल्ये परत करते, जी ऑपरेटिंग सिस्टमच्या एन्ट्रॉपीने सीड केलेल्या CSPRNG द्वारे तयार केली जातात.
आमचा ऑनलाइन यादृच्छिक संख्या जनरेटर प्रत्येक सोडतीसाठी Web Crypto API वापरतो, आणि संख्या सर्व्हरऐवजी तुमच्या ब्राउझरमध्ये तयार केल्या जातात. तुम्ही फासे टाकता, नाणे उडवता किंवा पासवर्ड तयार करता, याच साइटवरील इतर जनरेटर देखील याच स्रोताचा वापर करतात.
रँडम बिट्सपासून तुमच्या श्रेणीतील संख्येपर्यंत
क्रिप्टोग्राफिकदृष्ट्या सुरक्षित जनरेटर ही निष्पक्ष सोडतीची केवळ निम्मी बाजू आहे. तो कच्चे बिट्स देतो आणि प्रोग्रामला त्यांना तुमच्या श्रेणीतील संख्येत रूपांतरित करावे लागते — आणि इथेच असमानता निर्माण होऊ शकते. समजा स्रोताने समान शक्यतेसह 0 ते 9 ही मूल्ये दिली आणि तुम्हाला 0 ते 5 मधील संख्येची आवश्यकता आहे. 6 ने भागून उरणारी बाकी घेणे स्वाभाविक वाटते, परंतु अशा वेळी 0, 1, 2 आणि 3 हे प्रत्येकी दोन प्रकारे येऊ शकतात आणि 4 व 5 केवळ एकाच प्रकारे; त्यामुळे 0 ते 3 मधील प्रत्येक संख्येची शक्यता 20% असते, तर 4 आणि 5 ची शक्यता प्रत्येकी केवळ 10% राहते. ही असमानता दूर करण्याचा एक मार्ग म्हणजे न बसणारी मूल्ये वगळणे आणि पुन्हा सोडत काढणे; यादृच्छिक संख्या साहित्यात याविषयी सविस्तर माहिती दिली आहे.
आणखी दोन गोष्टी लोकांना आश्चर्यचकित करतात. पुनरावृत्ती सामान्य आहे: जेव्हा 1 ते 10 मधील एक पूर्ण संख्या स्वतंत्रपणे काढली जाते आणि प्रत्येक संख्येची शक्यता समान असते, तेव्हा नुकतीच काढलेली संख्या पुन्हा येण्याची शक्यता इतर कोणत्याही संख्येप्रमाणेच 10 पैकी 1 इतकीच असते. पुनरावृत्तीशिवाय काढलेली सोडत हा सोडतीचा एक वेगळा प्रकार आहे, तो अधिक यादृच्छिक नसतो. तसेच केवळ एक निष्पक्ष जनरेटर संपूर्ण प्रक्रियेला निष्पक्ष बनवत नाही: स्पर्धकांची यादी आणि प्रयत्नांची संख्या देखील तितकीच महत्त्वाची असते, जसे स्पर्धेचा यादृच्छिक विजेता कसा निवडावा यावरील आमच्या लेखात स्पष्ट केले आहे.