uniform(0, 1)उत्पादन कर सकते हैं 0, लेकिन यह करता हूँ कभी नहीं का उत्पादन 1।
प्रलेखन आपको बताता है कि endpoint b सकता है उत्पादन मूल्यों में शामिल किया:
bसमीकरण में फ्लोटिंग-पॉइंट राउंडिंग के आधार पर अंतिम-बिंदु मान सीमा में शामिल हो भी सकता है और नहीं भी a + (b-a) * random()।
तो uniform(0, 1), सूत्र 0 + (1-0) * random(), के लिए सरलीकृत 1 * random(), 1बिल्कुल उत्पादन करने में सक्षम होना चाहिए । यह तभी होगा जब random.random()1.0 exactly. However,यादृच्छिक () *never* produces1.0` होगा।
random.random()दस्तावेज का हवाला देते हुए :
रेंज में अगला रैंडम फ्लोटिंग पॉइंट नंबर [0.0, 1.0) पर लौटें।
संकेतन का [..., ...)अर्थ है कि पहला मूल्य सभी संभावित मूल्यों का हिस्सा है, लेकिन दूसरा नहीं है। random.random()अधिकांश उत्पादन मूल्यों के बहुत करीब होगा 1.0। पायथन का floatप्रकार एक IEEE 754 बेस 64 फ़्लोटिंग पॉइंट वैल्यू है , जो कई बाइनरी फ़्रैक्शन (1/2, 1/4, 1/5, आदि) को एनकोड करता है, जो वैल्यू बनाते हैं, और वैल्यू का random.random()उत्पादन केवल एक योग है (1/9007199254740992) के 2 ** -1माध्यम से (1/2) से उन 53 ऐसे अंशों का यादृच्छिक चयन 2 ** -53।
हालांकि, क्योंकि यह मान बहुत के करीब उत्पादन कर सकते हैं 1.0, एक साथ त्रुटियों है कि हो आप गुणा चल जब बिंदु nubmers गोलाई के साथ, आप कर सकते हैं उत्पादन bके लिए कुछ के मूल्यों aऔर b। लेकिन 0और 1उन मूल्यों में से नहीं हैं।
ध्यान दें कि 0.0 का उत्पादन random.random() कर सकते हैं, इसलिए aहमेशा random.uniform()( a + (b - a) * 0 == a) के लिए संभव मानों में शामिल है । क्योंकि 2 ** 53अलग - अलग मूल्य हैं जो random.random()उत्पादन कर सकते हैं (उन 53 बाइनरी अंशों के सभी संभावित संयोजनों), वहाँ केवल 1 में है 2 ** 53(इसलिए 1 में 9007199254740992) कभी भी होने की संभावना है।
तो उच्चतम संभव मूल्य जो random.random()उत्पादन कर सकता है 1 - (2 ** -53); b - aउच्च random.random()मूल्यों द्वारा गुणा करने पर किक करने के लिए राउंडिंग की अनुमति देने के लिए बस एक छोटा सा पर्याप्त मूल्य चुनें । जितना छोटा b - aहोता है, उतना अधिक होने की संभावना होती है:
>>> import random, sys
>>> def find_b():
... a, b = 0, sys.float_info.epsilon
... while random.uniform(a, b) != b:
... b /= 2
... else:
... return b
...
>>> print("uniform(0, {0}) == {0}".format(find_b()))
...
uniform(0, 4e-323) == 4e-323
यदि आप हिट करते हैं b = 0.0, तो हमने 1023 बार विभाजित किया है, उपरोक्त मान का मतलब है कि हम 1019 डिवीजनों के बाद भाग्यशाली हैं। मैंने अब तक पाया उच्चतम मूल्य (उपरोक्त फ़ंक्शन को एक लूप के साथ चला रहा है max()) 8.095e-320(1008 डिवीजन) है, लेकिन संभवतः उच्च मूल्य हैं। यह सब मौका का खेल है। :-)
यह तब भी हो सकता है , जब बीच a- बीच में बहुत सारे असतत कदम न हों b, जैसे कब aऔर bकिसके पास उच्च घातांक है और इसलिए यह बहुत दूर तक दिखाई दे सकता है। फ़्लोटिंग पॉइंट वैल्यू अभी भी केवल सन्निकटन हैं, और वे जिन मूल्यों को एनकोड कर सकते हैं वे परिमित हैं। उदाहरण के लिए, वहाँ केवल 1 के बीच अंतर की बाइनरी अंश है sys.float_info.maxऔर sys.float_info.max - (2 ** 970), इसलिए वहाँ है एक 50-50 मौका random.uniform(sys.float_info.max - (2 ** 970), sys.float_info.max)पैदा करता है sys.float_info.max:
>>> a, b = sys.float_info.max - (2 ** 970), sys.float_info.max
>>> values = [random.uniform(a, b) for _ in range(10000)]
>>> values.count(sys.float_info.max) # should be roughly 5000
4997
X ~ U(0,1)है, तोP(X=x)है लगभग निश्चित रूप से एक्स के सभी मूल्यों के लिए 0,। (ऐसा इसलिए है क्योंकि अंतराल में अनंत रूप से कई संभावित मूल्य हैं।) यदि आप ठीक 0 या 1 की तलाश कर रहे हैं, तो आपको एक अलग फ़ंक्शन का उपयोग करनाrandom.choice