रैंडम नंबर जनरेटर क्या है?

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

हार्डवेयर रैंडम नंबर जनरेटर

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

आधुनिक हार्डवेयर जनरेटर इसके बजाय सूक्ष्म घटनाओं को मापते हैं: इलेक्ट्रॉनिक सर्किट में शॉट नॉइज़ और थर्मल नॉइज़, वायुमंडलीय शोर, या क्वांटम प्रभाव। ये एंट्रॉपी के अच्छे स्रोत हैं — यानी वह अप्रत्याशितता जिसे मापा जा सकता है — लेकिन कोई भी भौतिक स्रोत स्वाभाविक रूप से त्रुटिहीन नहीं होता: इसमें पक्षपात हो सकता है, यह समय के साथ बदल सकता है और विफल भी हो सकता है। इसलिए इसकी गुणवत्ता का आकलन और निगरानी की जानी चाहिए, और आवश्यकता पड़ने पर इसके आउटपुट को आगे संसाधित किया जाता है, जैसा कि NIST SP 800-90B जैसे मानक वर्णन करते हैं। हार्डवेयर स्रोतों का उपयोग वहाँ किया जाता है जहाँ विश्वसनीयता सबसे अधिक मायने रखती है — विशेष रूप से क्रिप्टोग्राफ़ी में, जहाँ वे Transport Layer Security (TLS) जैसे प्रोटोकॉल के पीछे की कुंजियों के लिए अप्रत्याशित प्रारंभिक सामग्री प्रदान करते हैं।

स्यूडोरैंडम नंबर जनरेटर

भौतिक उपकरण का विकल्प एक एल्गोरिदम है। एक स्यूडोरैंडम नंबर जनरेटर (PRNG) संख्याओं का एक ऐसा क्रम तैयार करता है जो दिखने में रैंडम लगता है, लेकिन पूरी तरह से एक प्रारंभिक मान द्वारा निर्धारित होता है जिसे बीज या सीड (seed) कहा जाता है। एक ही एल्गोरिदम को वही सीड देने पर हर बार बिल्कुल वही क्रम प्राप्त होता है। यह वहाँ एक कमज़ोरी बन जाता है जहाँ परिणाम का अप्रत्याशित होना अनिवार्य हो और सीड या आंतरिक स्थिति का अनुमान लगाया या पुनर्निर्माण किया जा सके। वहीं यह वहाँ एक बड़ी ताकत है जहाँ परिणाम को दोबारा दोहराना आवश्यक हो — जैसे किसी सिमुलेशन या परीक्षण को दोबारा सटीक रूप से चलाना। PRNG तेज़, सस्ते और लागू करने में आसान भी होते हैं, यही कारण है कि अधिकांश सॉफ़्टवेयर इन्हीं पर निर्भर करते हैं। प्रसिद्ध एल्गोरिदम में लीनियर कॉन्ग्रुएंशियल जनरेटर (LCG), xorshift जनरेटर और Mersenne Twister शामिल हैं।

Mersenne Twister

Mersenne Twister, जिसे 1997 में माकोतो मात्सुमोतो और ताकुजी निशिमुरा द्वारा प्रकाशित किया गया था, सबसे व्यापक रूप से उपयोग किए जाने वाले स्यूडोरैंडम नंबर जनरेटरों में से एक है और कई प्रोग्रामिंग भाषाओं में डिफ़ॉल्ट है। इसका नाम इसकी अवधि से आता है — यानी दोहराव से पहले क्रम की लंबाई — जो इसके मानक संस्करण, MT19937 में, मेर्सन अभाज्य 219937 − 1 है। यह यादृच्छिकता के अधिकांश सांख्यिकीय परीक्षणों को पास करता है और सिमुलेशन के लिए बहुत उपयुक्त है। हालाँकि, इसे गोपनीय जानकारियों की सुरक्षा के लिए नहीं बनाया गया था: लगातार 624 32-बिट आउटपुट मानों से कोई भी इसकी आंतरिक स्थिति का पुनर्निर्माण कर सकता है और आगे आने वाले हर मान की भविष्यवाणी कर सकता है, इसलिए इसका उपयोग कुंजियों, पासवर्ड या किसी भी ऐसी चीज़ के लिए नहीं किया जाना चाहिए जिसे अप्रत्याशित रहना आवश्यक हो।

क्रिप्टोग्राफ़िक रूप से सुरक्षित जनरेटर और एंट्रॉपी

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

ब्राउज़र में रैंडम संख्याएँ

जावास्क्रिप्ट किसी वेब पेज को रैंडम मान प्राप्त करने के दो अंतर्निहित तरीके देता है, और वे अलग-अलग श्रेणियों से संबंधित हैं। Math.random() एक साधारण PRNG है: भाषा मानक प्रत्येक ब्राउज़र पर एल्गोरिदम का चुनाव छोड़ देता है और सुरक्षा के बारे में कोई गारंटी नहीं देता — यह किसी एनिमेशन के लिए ठीक है, लेकिन किसी ऐसे ड्रॉ के लिए अनुपयुक्त है जिस पर कोई विवाद हो सकता हो। दूसरा विकल्प Web Crypto API है। इसका crypto.getRandomValues() मेथड क्रिप्टोग्राफ़िक रूप से सुरक्षित रैंडम मान लौटाता है, जो ऑपरेटिंग सिस्टम की एंट्रॉपी से सीड किए गए CSPRNG द्वारा तैयार किए जाते हैं।

हमारा ऑनलाइन रैंडम नंबर जनरेटर प्रत्येक ड्रॉ के लिए Web Crypto API का उपयोग करता है, और संख्याएँ किसी सर्वर के बजाय आपके ब्राउज़र में उत्पन्न होती हैं। यही स्रोत इस साइट के अन्य जनरेटरों को भी चलाता है, चाहे आप पासा फेंकें, सिक्का उछालें या पासवर्ड जनरेट करें।

रैंडम बिट्स से आपकी सीमा की संख्या तक

एक क्रिप्टोग्राफ़िक रूप से सुरक्षित जनरेटर निष्पक्ष ड्रॉ का केवल आधा हिस्सा है। यह कच्चे बिट्स प्रदान करता है, और प्रोग्राम को अभी भी उन्हें आपकी सीमा के भीतर की संख्या में बदलना होता है — और यहीं पर पक्षपात (bias) आ सकता है। मान लीजिए कि स्रोत 0 से 9 तक के मान समान संभावना के साथ देता है और आपको 0 से 5 तक की संख्या चाहिए। 6 से भाग देने के बाद शेषफल लेना स्वाभाविक लग सकता है, लेकिन तब 0, 1, 2 और 3 में से प्रत्येक दो तरीकों से आ सकता है और 4 व 5 केवल एक तरीके से। इस प्रकार 0 से 3 तक की प्रत्येक संख्या के आने की संभावना 20% होती है, और 4 व 5 की केवल 10%। पक्षपात को दूर करने का एक तरीका यह है कि जो मान सीमा में फ़िट न हों उन्हें छोड़ दिया जाए और दोबारा ड्रॉ किया जाए; रैंडम नंबर जनरेटर सामग्री में इसे विस्तार से समझाया गया है।

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