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* produces
1.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