रैंडम नंबर जनरेटर
नतीजा
निकाले गए अंक
- संभव मान
- 100
- कम से कम एक अंक दोहराने की संभावना
- 9.65%
रैंडम नंबर जनरेटर एक शुरुआती बिंदु से आपकी तय की गई परिसर के भीतर पूर्ण संख्याओं की सूची बना देता है। यह परिसर, चाही गई संख्या की गिनती और रैंडम सीड लेता है, और ठीक उतने पूर्ण अंक लौटाता है — वही अंक हर बार जब आप वही सीड डालें, और यही गुण ऐसी सूची बनाता है जिसे आप किसी और को दे सकें और वह उसे दोबारा निकाल सके। दोहराव की इजाज़त बंद कर दीजिए तो नतीजा क्रम के बजाय चयन बन जाता है, यानी कोई मान दो बार नहीं आ सकता; इजाज़त चालू रखिए तो अंक स्वतंत्र निकासियाँ हैं, जो पासे, लॉटरी मशीन या ऐसी प्लेलिस्ट का ईमानदार नमूना है जिसमें कोई गाना दोबारा आ सकता है। पैनल यह भी बताता है कि परिसर में कितने अलग मान हैं और अगर दोहराव की इजाज़त होती तो किसी अंक के दोहराने की संभावना कितनी होती। शुरू में सबसे काम की बात यह समझ लेना है कि ये अंक अनुमान लगाने वाले नहीं हैं। जनरेटर साधारण सॉफ़्टवेयर में लगने वाला छोटा, तेज़, सीड-आधारित अंकगणितीय क्रम है: सीड जानने वाला कोई भी पूरी सूची दोबारा निकाल सकता है, और कुछ मानों को देखकर बाक़ी का अंदाज़ा लगाया जा सकता है।
फ़ॉर्मूला
next = (state + 0x6D2B79F5) को गुणा-शिफ़्ट चरणों से मिलाया जाता है → निकाला गया अंक = न्यूनतम + ⌊next × (अधिकतम − न्यूनतम + 1)⌋
- रैंडम सीड
- जनरेटर की शुरुआती अवस्था, 0 से 4,29,49,67,295 तक कोई भी पूर्ण संख्या। यह अपने आप में रैंडमता का स्रोत नहीं है — यह वह बिंदु है जहाँ से क्रम शुरू होता है, और ठीक इसीलिए वही सीड हमेशा वही सूची देता है
- चलती अवस्था
- चलती हुई अवस्था, जो हर अंक पर एक बार बदलती है। बदलाव अवस्था को एक तय स्थिरांक और कुछ गुणा-शिफ़्ट चरणों से मिलाता है; यही मिलावट लगातार आने वाले मानों को एक-दूसरे से बेमेल दिखाती है, और अगर इसे सरल बनाया जाए तो सबसे पहले यही चरण टूटेगा
- न्यूनतम, अधिकतम
- परिसर के दोनों सिरे, दोनों शामिल। परिसर की चौड़ाई ही वह पैमाना है जिससे भिन्न को गुणा किया जाता है, इसलिए परिसर की हर पूर्ण संख्या का मौक़ा बराबर रहता है
- ⌊ ⌋
- नीचे की ओर पूर्णांकन। जनरेटर 0 से 1 के बीच (1 को छोड़कर) एक भिन्न बनाता है और फ़्लोर उसे परिसर की किसी एक पूर्ण संख्या में बदल देता है
- संख्या
- कितने अंक बनाने हैं, 200 तक। दोहराव बंद होने पर यह परिसर की चौड़ाई से बड़ी नहीं हो सकती, क्योंकि चयन उस पूल से लंबा नहीं हो सकता जिससे वह बनता है
इसे तब लगाइए जब एक संख्या नहीं, सूची चाहिए हो: हाथ से जाँचने के लिए नमूना, ऐसे परीक्षण मामले जो हर बार वही रहें, ऐसी निकासी जिसे दर्शकों के सामने दोबारा चलाया जा सके, या भरने का नक़ली डेटा। सीड तय कर पाना ही वह वजह है जिससे यह आपकी भाषा के बने-बनाए रैंडम फलन से बेहतर है — सीड एक बार का नतीजा ऐसी चीज़ बना देता है जिसे आप बाँट सकें, दोबारा जाँच सकें और उस पर बहस कर सकें। जहाँ एक ही चीज़ दो बार नहीं आनी चाहिए वहाँ दोहराव बंद करके इस्तेमाल कीजिए, क्योंकि यही लॉटरी निकालने, सूची से रैंडम नमूना लेने और क्रम फेरबदलने का आकार है। दो काम इसके नहीं हैं: यह अनुमान न लगाए जा सकने वाली संख्याओं का स्रोत नहीं है, इसलिए जो कुछ भी अनुमेय न हो वह यहाँ नहीं आता; और यह किसी असली समूह के सांख्यिकीय रैंडम नमूने का विकल्प नहीं है, क्योंकि इसे समूह के बारे में कुछ पता नहीं, सिर्फ़ परिसर के बारे में।
हल किए हुए उदाहरण
1 से 100 तक पाँच अंक, और वही पाँच फिर से
- 1 से 100 के परिसर में 100 अलग मान हैं, इसलिए हर निकासी इन 100 में से एक है
- सीड 1 शुरुआती अवस्था तय करता है; पाँचों अंक उसे एक-एक बार बदलते हैं
- हर भिन्न को 1 से 100 में नीचे की ओर पूर्णांकित करने पर उसी क्रम में 63, 1, 53, 99 और 97 मिलते हैं
ये पाँच अंक न संयोग हैं और न कहीं जमा हुई तालिका: यही सीड 1 निकालता है, और सीड वाले खाने में दोबारा 1 डालने पर वे बिल्कुल वही लौटते हैं। ध्यान दीजिए कि 9.65% परिसर और गिनती के बारे में बयान है, इस निकासी के बारे में नहीं — सौ मानों से पाँच निकासियों में दस में एक से कुछ कम मौक़ा है कि दो मान टकरा जाएँ, चाहे इस सूची में कोई दो टकराएँ या न टकराएँ। सीड 7 कर देने पर बिल्कुल अलग सूची मिलती है जबकि वह प्रतिशत वहीं का वहीं रहता है, और यह देखने का सबसे साफ़ तरीक़ा है कि पैनल का कौन-सा हिस्सा रैंडम है और कौन-सा अंकगणित।
1 से 49 तक छह अंक, दोहराव मना करके
- पूल में 49 मान हैं और उसमें से छह बिना दोहराव निकाले जाते हैं
- हर नया अंक तब तक दोबारा निकाला जाता है जब तक वह ऐसा मान न हो जो पूल पहले ही दे चुका हो, और इसीलिए कोई मान दो बार नहीं आ सकता
- सूची को उसी क्रम में पढ़ने पर 23, 16, 33, 31, 8 और 11 मिलते हैं
दोहराव बंद करने से 27.26% नहीं बदलता, और इसी उदाहरण के साथ उसे छापने का मतलब यही है: यह वह मौक़ा है जो 49 में से छह निकासियों में तब होता अगर दोहराव की इजाज़त होती, और आपने उसे मना किया या नहीं, इससे उस संख्या पर कोई फ़र्क़ नहीं पड़ता। यही बात बड़ी गिनतियों पर दोहराव-रहित निकासी को महँगा बनाती है — 49 मानों से छह निकासियों पर बिना रोक के चौथाई से ज़्यादा निकासियों में कुछ दोहरा जाता, और 365 में से 23 निकासियों पर यह आँकड़ा आधे से ऊपर चला जाता है। अंक उसी क्रम में रहते हैं जिसमें निकाले गए, क्रम से लगाए नहीं जाते, ताकि वही सीड और वही सेटिंग हमेशा वही सूची दोबारा दे।
ऐसी परिसर जिसमें सिर्फ़ एक मान है
- परिसर में ठीक एक मान है, इसलिए हर निकासी वही मान है
- दोहराने की संभावना यह मौक़ा है कि चार निकासियाँ टकराएँ, और एक के पूल में वे टकरानी ही हैं
- नतीजा 7, 7, 7 और 7 है
यह वह किनारा है जहाँ रैंडम नंबर जनरेटर रैंडम रहना छोड़कर स्थिरांक बन जाता है, और इसे याद रखना काम का है क्योंकि यह अकेला ऐसा मामला है जहाँ कुछ भी दबाने से पहले नतीजा पूरी तरह बताया जा सकता है। यह दोहराव-रहित मोड की सीमा भी दिखाता है: इसी परिसर के साथ दो अंक बिना दोहराव माँगना छोटी सूची नहीं, असंभव माँग है, और पेज चुपचाप एक अंक लौटाने के बजाय यह बता देता है।
सीमाएँ
ये अंक ऐसे किसी भी काम के लिए ठीक नहीं हैं जहाँ अनुमान न लगाया जा सकना ज़रूरी हो। जनरेटर साधारण सॉफ़्टवेयर में लगने वाला छोटा, तेज़, सीड-आधारित अंकगणितीय क्रम है: सीड मिलने पर कोई भी पूरी सूची दोबारा निकाल सकता है, और सूची के कुछ मानों से बाक़ी निकाले जा सकते हैं। इसीलिए यह पासवर्ड, कुंजियों, टोकन, एक-बार वाले कोड, असली पैसे वाली लॉटरी और हर उस चीज़ से बाहर है जहाँ किसी भाग लेने वाले को नतीजा पहले से जानने या दोबारा बनाने का मौक़ा नहीं मिलना चाहिए — वहाँ क्रिप्टोग्राफ़िक रैंडम स्रोत ही सही जवाब है। दोहराने की संभावना भी उस सूची के बारे में दावा नहीं है जो आप देख रहे हैं: यह वह संभावना है कि उस पूल से उस आकार की निकासी में कम से कम एक टकराव आए, जो इस तरह गिनी जाती है जैसे निकासियाँ स्वतंत्र और एकरूप हों, और यह दोहराव की इजाज़त हो या न हो, दोनों हालत में बताई जाती है। इसका असली मतलब वही है जो लोगों को चौंकाता है — टकराव के लिए पूल के आकार का लगभग वर्गमूल ही काफ़ी हो जाता है, इसलिए 365 तारीख़ों में से 23 निकासियाँ पहले ही आधे से ज़्यादा मौक़ा बना देती हैं। साथ ही एक बार में गिनती 200 तक सीमित है, और गिनती पूल से आगे बढ़ते ही दोहराव-रहित निकासी असंभव हो जाती है।
अक्सर पूछे जाने वाले सवाल
- क्या ये अंक लॉटरी, पासवर्ड या सुरक्षा टोकन में इस्तेमाल करने लायक़ हैं?
- नहीं। यह जनरेटर साधारण सॉफ़्टवेयर में लगने वाला छोटा, सीड-आधारित अंकगणितीय क्रम है, क्रिप्टोग्राफ़िक जनरेटर नहीं: सीड से पूरी सूची दोबारा बनाई जा सकती है, और उसके कुछ मानों से बाक़ी निकाले जा सकते हैं। जहाँ किसी भाग लेने वाले को नतीजा पहले से जानने या दोबारा बनाने का मौक़ा नहीं मिलना चाहिए — असली पैसे वाली लॉटरी, पासवर्ड, कुंजियाँ, टोकन, एक-बार वाले कोड — वहाँ क्रिप्टोग्राफ़िक रैंडम स्रोत चाहिए। निकासी, नमूने, खेल और परीक्षण डेटा के लिए, जहाँ दोबारा निकल पाना कमज़ोरी नहीं ख़ूबी है, यह सही औज़ार है।
- रैंडम सीड किस काम का है, और मुझे हर बार वही अंक क्यों मिलते हैं?
- सीड वह अवस्था है जहाँ से क्रम शुरू होता है, इसलिए वही सीड हमेशा वही सूची बनाता है। यह जान-बूझकर है: इससे नतीजा दोहराया जा सकता है, और यही तब चाहिए जब आपको कोई नमूना किसी और को देना हो, दर्शकों के सामने कोई निकासी दोबारा चलानी हो, या कोई परीक्षण मामला बदलने से बचाना हो। सीड बदलिए और उन्हीं सेटिंग्स पर अलग सूची मिलती है। अगर हर बार अलग अंक चाहिए तो हर बार सीड बदल दीजिए — आपकी डाली हुई संख्या नतीजे के साथ दर्ज रहती है, इसलिए जो सूची पसंद आई उसे हमेशा दोबारा पाया जा सकता है।
- दोहराव की इजाज़त होने पर भी दोहराव क्यों आ जाता है?
- क्योंकि हर निकासी स्वतंत्र है। दोहराव चालू होने पर हर स्थान परिसर के किसी भी मान को चुनता है, इस बात का ध्यान रखे बिना कि बाक़ी स्थानों ने क्या चुना था, और पासे या ऐसी लॉटरी मशीन का ईमानदार नमूना यही है जो गेंद वापस डाल देती है। पैनल पर छपी दोहराने की संभावना ठीक वह संभावना है कि कम से कम एक जोड़ी टकराए — सौ मानों से पाँच निकासियों पर क़रीब 9.65%, और 365 में से 23 मान निकालते ही 50% से ऊपर। जब कोई मान दो बार नहीं आना चाहिए तो दोहराव बंद कर दीजिए, क्योंकि यही लॉटरी, सूची के नमूने या फेरबदल किए क्रम का आकार है।
- दोहराव मना करने पर दोहराने की संभावना कम हो जाती है?
- नहीं, और पैनल जान-बूझकर वही संख्या दिखाता रहता है। वह उस सवाल का जवाब देती है जो आप उस स्विच को पलटते समय असल में पूछ रहे होते हैं: अगर दोहराव की इजाज़त होती तो टकराव कितना संभव था। 1 से 49 तक छह अंकों के लिए यह 27.26% है, इसलिए दोहराव मना करना सैद्धांतिक नहीं, असली जोखिम हटाता है। यही यह भी समझाता है कि बड़ी गिनतियों पर दोहराव-रहित निकासी धीमी और आख़िर में असंभव क्यों हो जाती है — जब गिनती परिसर के मानों से आगे निकल जाए तो कोई मान्य जवाब होता ही नहीं, और पेज छोटी सूची लौटाने के बजाय यह बता देता है।
- एक बार में कितने अंक बना सकते हैं, और किस परिसर में?
- एक बार में 200 अंक तक, और परिसर के दोनों सिरे पूर्ण संख्याएँ होने चाहिए जिनमें न्यूनतम अधिकतम से बड़ा न हो। मान ऋणात्मक भी हो सकते हैं, इसलिए −50 से 50 तक की परिसर ठीक है। पूर्ण संख्या न होने वाले सिरे गोल करने के बजाय नामंज़ूर कर दिए जाते हैं: दोहराव मना होने पर ऐसी परिसर से निकालना, जिसमें भिन्न भी हों, दोहराव-रहित नियम को ख़ाली शर्त बना देता, और अपनी ही सेटिंग को चुपचाप अनसुना करती हुई ठीक दिखने वाली सूची ग़लत संदेश से बुरी है।
- क्या अंक क्रम से लगे हुए हैं?
- नहीं — वे उसी क्रम में छपते हैं जिसमें निकाले गए, और वह क्रम नतीजे का हिस्सा है। क्रम से लगाना उस जानकारी को फेंक देना होता जिसे वही सीड दोबारा बनाने का वादा करता है, और जहाँ स्थान का मतलब हो वहाँ यह मायने रखता है, जैसे फेरबदल किया हुआ क्रम बाँटना या पत्ते बाँटना। अगर क्रम से लगा चयन चाहिए तो सूची कॉपी करने के बाद ख़ुद क्रम से लगा लीजिए; निकासी ख़ुद उसी क्रम के प्रति सच्ची रहती है जो सीड ने बनाया।
संदर्भ
- SP 800-90A Rev. 1, Recommendation for Random Number Generation Using Deterministic Random Bit Generators — National Institute of Standards and Technology (NIST), Computer Security Resource Center
- Math.random() — JavaScript reference (a built-in generator with no seed parameter, and the explicit warning that it is not cryptographically secure) — MDN Web Docs, Mozilla
- Birthday Problem — from Wolfram MathWorld (the probability that a group drawn from a pool contains a repeated value, 1 − the falling-factorial product over the pool size) — Wolfram MathWorld