क्या संयोग वास्तव में संयोग हैं? JavaScript को 'ईमानदार' संख्याएँ कैसे दें
\n\nकल्पना करें: आप एक गेम लिख रहे हैं जहाँ दुश्मन स्क्रीन पर एक यादृच्छिक बिंदु पर दिखाई देता है। या आप एक A/B परीक्षण बना रहे हैं जो उपयोगकर्ताओं को समूहों में समान रूप से वितरित करता है। या बस एक यादृच्छिक पासवर्ड उत्पन्न करना चाहते हैं। हर जगह आपको एक ही जादू की आवश्यकता होगी — JavaScript में दो मानों के बीच एक यादृच्छिक संख्या उत्पन्न करना।
\n\nऐसा लगता है, इससे आसान क्या हो सकता है? Math.random() — और काम हो गया। लेकिन, जैसा कि Stack Overflow पर लोकप्रिय प्रश्न (लाखों व्यूज़, हज़ारों वोट) दिखाता है, शैतान विवरण में छिपा है। गलत कार्यान्वयन से वितरण में पूर्वाग्रह (bias), प्रदर्शन में मंदी और अप्रत्याशित बग हो सकते हैं।
इस लेख में हम केवल तैयार कोड नहीं देंगे। हम इसकी संरचना का विश्लेषण करेंगे, विभिन्न परिदृश्यों के लिए अनुकूलन करना सीखेंगे और समझेंगे कि कैसे जनरेशन को अधिकतम प्रदर्शनशील बनाया जाए। चलिए शुरू करते हैं!
\n\nमूल बातें: Math.random() और यह अकेला क्यों पर्याप्त नहीं है
\n\nJS में किसी भी यादृच्छिक संख्या जनरेशन के केंद्र में Math.random() विधि है। यह सीमा [0, 1) (0 को शामिल करते हुए, लेकिन 1 को कभी शामिल नहीं करते हुए) से एक छद्म-यादृच्छिक फ़्लोटिंग-पॉइंट संख्या लौटाती है।
console.log(Math.random()); // 0.234567890123456\nconsole.log(Math.random()); // 0.987654321098765\n\nयह एक उत्कृष्ट आधार है, लेकिन यह बेकार है यदि आपको 5 से 10 या -100 से 100 तक की संख्या चाहिए। हमें एक निर्दिष्ट सीमा में यादृच्छिक संख्या उत्पन्न करने के लिए एक फ़ंक्शन की आवश्यकता है।
\n\nStack Overflow से विहित उत्तर
\n\nसबसे लोकप्रिय और सही समाधान इस प्रकार दिखता है:
\n\nfunction getRandomArbitrary(min, max) {\n return Math.random() * (max - min) + min;\n}\n\n- \n
- यह कैसे काम करता है:
(max - min)— सीमा की चौड़ाई है।Math.random()से गुणा करने पर, हमें 0 से चौड़ाई तक की संख्या मिलती है।minजोड़ने पर, हम परिणाम को वांछित सीमा में स्थानांतरित कर देते हैं। \n - परिणाम: min (शामिल) से max (अपवर्जित) तक एक भिन्नात्मक संख्या। \n
लेकिन क्या होगा यदि आपको एक पूर्णांक चाहिए? यहाँ Math.floor(), Math.ceil() और Math.round() काम में आते हैं।
यादृच्छिक पूर्णांक उत्पन्न करना: गोलाई में शैतान
\n\nStack Overflow पर उत्तर का दूसरा भाग पूर्णांकों के लिए फ़ंक्शन है:
\n\nfunction 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 नहीं लौटाता है।
क्यों Math.ceil() और Math.floor()?
\nयह मूर्खता से बचाव है। यदि कोई फ़ंक्शन में min = 1.5 पास करता है, तो Math.ceil(1.5) इसे 2 में बदल देगा। और Math.floor(9.9) — 9 में। यह पूर्णांक इनपुट और पूर्वानुमानित परिणाम सुनिश्चित करता है।
प्रदर्शन अनुकूलन: दृष्टिकोणों की तुलना
\n\nअब सबसे दिलचस्प भाग — JavaScript में यादृच्छिक संख्या जनरेशन का प्रदर्शन। मान लीजिए, आपको canvas पर 10,000 यादृच्छिक बिंदु बनाने हैं। हर मिलीसेकंड मायने रखता है।
\n\nहमने तीन दृष्टिकोणों का परीक्षण किया:
\n\n| दृष्टिकोण | \nकोड | \nसमय (10 मिलियन पुनरावृत्तियाँ) | \n
|---|---|---|
| क्लासिक (गोलाई के साथ) | \nMath.floor(Math.random() * (max - min + 1)) + min | \n ~180 मि.से. | \n
| बिटवाइज़ OR (ट्रिक) के साथ | \n(Math.random() * (max - min +
|