जावास्क्रिप्ट में यादृच्छिक पूर्णांक उत्पन्न करना: 2025 में सटीक रेंज

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जावास्क्रिप्ट में यादृच्छिक संख्याएँ: अराजकता से क्रम तक

\n

कल्पना करें: आप एक गेम लिख रहे हैं जहाँ आपको 1 से 100 के बीच बेतरतीब ढंग से एक खजाने का संदूक चुनना है। या हो सकता है, आप एक A/B परीक्षण बना रहे हों जो उपयोगकर्ता के लिए एक यादृच्छिक विकल्प चुनता है। ऐसा लगता है, इससे आसान क्या हो सकता है? लेकिन शैतान, हमेशा की तरह, विवरणों में छिपा है। जावास्क्रिप्ट में एक विशिष्ट रेंज में यादृच्छिक पूर्णांक उत्पन्न करने का प्रश्न Stack Overflow पर सबसे लोकप्रिय में से एक है, और यह व्यर्थ नहीं है। अनुभवी डेवलपर्स भी कभी-कभी Math.random() के नुकसानों पर फिसल जाते हैं।

\n

इस लेख में, हम न केवल शास्त्रीय विधियों, बल्कि 2025 की सर्वोत्तम प्रथाओं का भी विश्लेषण करेंगे: कोड को न केवल कार्यात्मक, बल्कि सुरक्षित, पूर्वानुमानित (अच्छे अर्थों में) और कुशल कैसे बनाया जाए। चलिए शुरू करते हैं!

\n\n

शैली का क्लासिक: Math.random() और नुकसान

\n

आइए मूल बातों से शुरू करें। अंतर्निहित फ़ंक्शन Math.random() [0, 1) रेंज में एक छद्म-यादृच्छिक फ़्लोटिंग-पॉइंट संख्या लौटाता है। मुख्य बिंदु: 0 शामिल है, लेकिन 1 नहीं है। यह एक 'अनुचित' वितरण है यदि आप पूर्णांक प्राप्त करना चाहते हैं।

\n

यहाँ सबसे सामान्य (और सबसे गलत) तरीका है जो अक्सर पुरानी पाठ्यपुस्तकों में पाया जाता है:

\n
// खराब उदाहरण: संभाव्यता में पूर्वाग्रह\nfunction getRandomBad(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n
\n

पहली नज़र में, सब कुछ सही लगता है। लेकिन गहराई से देखते हैं। Math.floor() नीचे की ओर पूर्णांकित करता है। यदि Math.random() 1 के बहुत करीब (लेकिन बराबर नहीं) एक संख्या उत्पन्न करता है, तो (max - min + 1) से गुणा करने पर max + 1 से कम मान मिलेगा, और Math.floor() इसे काट देगा। हालाँकि, फ़्लोटिंग-पॉइंट संख्याओं (IEEE 754) की सीमित सटीकता के कारण, कुछ मान दूसरों की तुलना में कम बार आते हैं। 0-1 की रेंज के लिए यह ध्यान देने योग्य नहीं है, लेकिन बड़ी रेंज (जैसे, 1 से 1,000,000) के लिए, पूर्वाग्रह सांख्यिकीय रूप से महत्वपूर्ण हो जाता है।

\n

निष्कर्ष: यह सूत्र छोटी रेंज के लिए काम करता है, लेकिन 'क्रिप्टोग्राफिक रूप से शुद्ध' नहीं है और वितरण में विकृति पैदा कर सकता है।

\n\n

MDN से सही सूत्र

\n

Mozilla Developer Network (MDN) एक अधिक सटीक दृष्टिकोण की सिफारिश करता है जो पूर्णांकन त्रुटियों को कम करता है:

\n
// अच्छा, सार्वभौमिक तरीका\nfunction getRandomIntInclusive(min, max) {\n  const minCeiled = Math.ceil(min);\n  const maxFloored = Math.floor(max);\n  return Math.floor(Math.random() * (maxFloored - minCeiled + 1) + minCeiled);\n}\n
\n

अंतर यह है कि हम Math.ceil() और Math.floor() का उपयोग करके सीमाओं को स्पष्ट रूप से पूर्णांकों में बदलते हैं। यह सुनिश्चित करता है कि min और max को सही ढंग से संसाधित किया जाएगा, भले ही आप गलती से एक भिन्नात्मक संख्या पास कर दें। 2025 में इस विधि को मूल मानक के रूप में उपयोग करें।

\n\n

विकल्प: जब Math.random() पर्याप्त नहीं है

\n

क्लासिक Math.random() एक छद्म-यादृच्छिक जनरेटर (PRNG) है। यह नियतात्मक है: यदि आप प्रारंभिक बीज (seed) जानते हैं, तो आप पूरे अनुक्रम की भविष्यवाणी कर सकते हैं। अधिकांश वेब अनुप्रयोगों (एनिमेशन, यादृच्छिक सामग्री) के लिए यह पर्याप्त है। लेकिन ऐसे परिदृश्य हैं जहाँ वास्तविक यादृच्छिकता की आवश्यकता होती है:

\n
    \n
  • सुरक्षा: टोकन, पासवर्ड, CSRF-टोकन का उत्पादन।
  • \n
  • क्रिप्टोग्राफी: क्लाइंट पर डेटा एन्क्रिप्शन।
  • \n
  • जुआ: जीत का उचित वितरण।
  • \n
\n

इन मामलों में, crypto.getRandomValues() बचाव में आता है - एक क्रिप्टोग्राफिक रूप से सुरक्षित जनरेटर (CSPRNG)। यह सिस्टम एन्ट्रॉपी स्रोतों का उपयोग करता है और बहुत कम पूर्वानुमानित होता है।

\n\n

crypto.getRandomValues() के साथ पूर्णांक उत्पन्न करना

\n

यहाँ बताया गया है कि 2025 का आधुनिक कार्यान्वयन कैसा दिखता है:

\n
// रेंज [min, max] में सुरक्षित यादृच्छिक पूर्णांक उत्पादन\nfunction getSecureRandomInt(min, max) {\n  const range = max - min + 1;\n  // अधिकतम मान जो range का गुणज है (पूर्वाग्रह से बचने के लिए)                

ब्लॉग

पुस्तक अनुशंसाएँ