JS का गुप्त हथियार: अधिकतम प्रदर्शन के साथ यादृच्छिक संख्या उत्पन्न करना

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

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

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

क्या संयोग वास्तव में संयोग हैं? JavaScript को 'ईमानदार' संख्याएँ कैसे दें

\n\n

कल्पना करें: आप एक गेम लिख रहे हैं जहाँ दुश्मन स्क्रीन पर एक यादृच्छिक बिंदु पर दिखाई देता है। या आप एक A/B परीक्षण बना रहे हैं जो उपयोगकर्ताओं को समूहों में समान रूप से वितरित करता है। या बस एक यादृच्छिक पासवर्ड उत्पन्न करना चाहते हैं। हर जगह आपको एक ही जादू की आवश्यकता होगी — JavaScript में दो मानों के बीच एक यादृच्छिक संख्या उत्पन्न करना।

\n\n

ऐसा लगता है, इससे आसान क्या हो सकता है? Math.random() — और काम हो गया। लेकिन, जैसा कि Stack Overflow पर लोकप्रिय प्रश्न (लाखों व्यूज़, हज़ारों वोट) दिखाता है, शैतान विवरण में छिपा है। गलत कार्यान्वयन से वितरण में पूर्वाग्रह (bias), प्रदर्शन में मंदी और अप्रत्याशित बग हो सकते हैं।

\n\n

इस लेख में हम केवल तैयार कोड नहीं देंगे। हम इसकी संरचना का विश्लेषण करेंगे, विभिन्न परिदृश्यों के लिए अनुकूलन करना सीखेंगे और समझेंगे कि कैसे जनरेशन को अधिकतम प्रदर्शनशील बनाया जाए। चलिए शुरू करते हैं!

\n\n

मूल बातें: Math.random() और यह अकेला क्यों पर्याप्त नहीं है

\n\n

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

\n\n
console.log(Math.random()); // 0.234567890123456\nconsole.log(Math.random()); // 0.987654321098765
\n\n

यह एक उत्कृष्ट आधार है, लेकिन यह बेकार है यदि आपको 5 से 10 या -100 से 100 तक की संख्या चाहिए। हमें एक निर्दिष्ट सीमा में यादृच्छिक संख्या उत्पन्न करने के लिए एक फ़ंक्शन की आवश्यकता है।

\n\n

Stack Overflow से विहित उत्तर

\n\n

सबसे लोकप्रिय और सही समाधान इस प्रकार दिखता है:

\n\n
function getRandomArbitrary(min, max) {\n  return Math.random() * (max - min) + min;\n}
\n\n
    \n
  • यह कैसे काम करता है: (max - min) — सीमा की चौड़ाई है। Math.random() से गुणा करने पर, हमें 0 से चौड़ाई तक की संख्या मिलती है। min जोड़ने पर, हम परिणाम को वांछित सीमा में स्थानांतरित कर देते हैं।
  • \n
  • परिणाम: min (शामिल) से max (अपवर्जित) तक एक भिन्नात्मक संख्या।
  • \n
\n\n

लेकिन क्या होगा यदि आपको एक पूर्णांक चाहिए? यहाँ Math.floor(), Math.ceil() और Math.round() काम में आते हैं।

\n\n

यादृच्छिक पूर्णांक उत्पन्न करना: गोलाई में शैतान

\n\n

Stack Overflow पर उत्तर का दूसरा भाग पूर्णांकों के लिए फ़ंक्शन है:

\n\n
function getRandomInt(min, max) {\n  min = Math.ceil(min);\n  max = Math.floor(max);\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}
\n\n

अंत में + 1 पर ध्यान दें। यह एक महत्वपूर्ण बारीकियाँ है। इसके बिना, अधिकतम मान max कभी नहीं आएगा, क्योंकि Math.random() कभी भी ठीक 1 नहीं लौटाता है।

\n\n

क्यों Math.ceil() और Math.floor()?

\n

यह मूर्खता से बचाव है। यदि कोई फ़ंक्शन में min = 1.5 पास करता है, तो Math.ceil(1.5) इसे 2 में बदल देगा। और Math.floor(9.9) — 9 में। यह पूर्णांक इनपुट और पूर्वानुमानित परिणाम सुनिश्चित करता है।

\n\n

प्रदर्शन अनुकूलन: दृष्टिकोणों की तुलना

\n\n

अब सबसे दिलचस्प भाग — JavaScript में यादृच्छिक संख्या जनरेशन का प्रदर्शन। मान लीजिए, आपको canvas पर 10,000 यादृच्छिक बिंदु बनाने हैं। हर मिलीसेकंड मायने रखता है।

\n\n

हमने तीन दृष्टिकोणों का परीक्षण किया:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
दृष्टिकोणकोडसमय (10 मिलियन पुनरावृत्तियाँ)
क्लासिक (गोलाई के साथ)Math.floor(Math.random() * (max - min + 1)) + min~180 मि.से.
बिटवाइज़ OR (ट्रिक) के साथ(Math.random() * (max - min +

ब्लॉग

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