आपके प्रश्न का सरल उत्तर यह है कि Math.random()
नियम # 2 का उल्लंघन है।
यहाँ कई अन्य उत्तरों ने बताया Math.random()
है कि इस समारोह की उपस्थिति शुद्ध नहीं है। लेकिन मुझे लगता है कि यह कहने लायक है कि क्यों Math.random()
टेंट कार्य करता है जो इसका उपयोग करते हैं।
सभी छद्म आयामी संख्या जनरेटर की तरह, Math.random()
एक "बीज" मूल्य से शुरू होता है। यह उस मूल्य को निम्न-स्तरीय बिट जोड़तोड़ या अन्य संचालन की एक श्रृंखला के लिए शुरुआती बिंदु के रूप में उपयोग करता है जिसके परिणामस्वरूप अप्रत्याशित (लेकिन वास्तव में यादृच्छिक नहीं ) आउटपुट होता है।
जावास्क्रिप्ट में, शामिल प्रक्रिया कार्यान्वयन-निर्भर है, और कई अन्य भाषाओं के विपरीत, जावास्क्रिप्ट बीज का चयन करने का कोई तरीका प्रदान नहीं करता है :
कार्यान्वयन यादृच्छिक बीज पीढ़ी एल्गोरिदम के लिए प्रारंभिक बीज का चयन करता है; इसे उपयोगकर्ता द्वारा चुना या रीसेट नहीं किया जा सकता है।
इसलिए यह फ़ंक्शन शुद्ध नहीं है: जावास्क्रिप्ट अनिवार्य रूप से एक अंतर्निहित फ़ंक्शन पैरामीटर का उपयोग कर रहा है जिसका आपके पास कोई नियंत्रण नहीं है। यह उस पैरामीटर को उस डेटा से पढ़ रहा है, जिसकी गणना कहीं और की जाती है, और इसलिए आपकी परिभाषा में नियम # 2 का उल्लंघन होता है।
यदि आप इसे एक शुद्ध कार्य करना चाहते हैं, तो आप यहां वर्णित वैकल्पिक यादृच्छिक संख्या जनरेटर में से एक का उपयोग कर सकते हैं । उस जनरेटर को बुलाओ seedable_random
। यह एक पैरामीटर (बीज) लेता है और एक "यादृच्छिक" संख्या देता है। बेशक, यह संख्या वास्तव में यादृच्छिक नहीं है; यह विशिष्ट रूप से बीज द्वारा निर्धारित किया जाता है। इसलिए यह एक शुद्ध कार्य है। आउटपुट seedable_random
केवल "यादृच्छिक" इस अर्थ में है कि इनपुट के आधार पर आउटपुट की भविष्यवाणी करना मुश्किल है।
इस फ़ंक्शन के शुद्ध संस्करण को तीन पैरामीटर लेने की आवश्यकता होगी :
function test(min, max, seed) {
return seedable_random(seed) * (max - min) + min;
}
(min, max, seed)
मापदंडों के किसी भी ट्रिपल के लिए , यह हमेशा एक ही परिणाम लौटाएगा।
ध्यान दें कि यदि आप आउटपुट seedable_random
को वास्तव में यादृच्छिक होना चाहते हैं , तो आपको बीज को यादृच्छिक बनाने का एक तरीका खोजना होगा! और जो भी रणनीति आपने इस्तेमाल की है वह अनिवार्य रूप से गैर-शुद्ध होगी, क्योंकि इसके लिए आपको अपने फ़ंक्शन के बाहर स्रोत से जानकारी एकत्र करने की आवश्यकता होगी। जैसा कि mtraceur और jpmc26 मुझे याद दिलाते हैं, इसमें सभी भौतिक दृष्टिकोण शामिल हैं: हार्डवेयर यादृच्छिक संख्या जनरेटर , लेंस कैप के साथ वेबकैम , वायुमंडलीय शोर संग्राहक - यहां तक कि लावा लैंप भी । इन सभी में फ़ंक्शन के बाहर गणना और संग्रहीत डेटा का उपयोग करना शामिल है।
Math.random()
जो आरएनजी की स्थिति को बदलता है।