क्या random.uniform (0,1) कभी 0 या 1 उत्पन्न कर सकता है?


9

में प्रलेखन यह कहा जाता है इस बात की संभावना है कि यह है कि uniform(0,1)मूल्यों को उत्पन्न कर सकते हैं 0और 1

मैंने uniform(0, 1)10000 बार दौड़ लगाई है, लेकिन इसने कभी शून्य पैदा नहीं किया। के मामले में भी uniform(0, 0.001)

random.uniform(0,1)कभी उत्पन्न कर सकता है 0या 1?


3
यह सैद्धांतिक रूप से संभवतः है, लेकिन व्यावहारिक रूप से कभी नहीं होगा। गणित के अनुसार, एक मानक यूनीफॉर्म यादृच्छिक चर 1. 0 के अंतराल में किसी भी मूल्य पर ले जा सकते हैं यदि X ~ U(0,1)है, तो P(X=x)है लगभग निश्चित रूप से एक्स के सभी मूल्यों के लिए 0,। (ऐसा इसलिए है क्योंकि अंतराल में अनंत रूप से कई संभावित मूल्य हैं।) यदि आप ठीक 0 या 1 की तलाश कर रहे हैं, तो आपको एक अलग फ़ंक्शन का उपयोग करना random.choice
चाहिए-

1
@ पॉल्ट का लगभग निश्चित रूप से गणित में एक बहुत विशिष्ट अर्थ है, जो वास्तव में यहां समझ में नहीं आता है क्योंकि हमारे पास एक असतत वितरण एक निरंतर अंतराल नहीं है। केवल 0 और 1. के बीच तैरने की एक सीमित संख्या है
wim

2
@ पपली तो ओपी के कार्यान्वयन के बारे में पूछने पर आप गणितीय क्यों बोल रहे हैं random.uniform?
विम

1
यदि वह दस्तावेज सही है, तो मैं उत्सुक हूं कि यह कैसे संभवत: 0 और 1. दोनों का उत्पादन करने के लिए बनाया गया है [जैसे 0, 1) लगता है यह बहुत आसान होगा (जो कि Math.random()उदाहरण के लिए जावास्क्रिप्ट में काम करता है)।
Ry-

1
50 अंक पहले व्यक्ति के लिए एक यादृच्छिक बीज पोस्ट करने के लिए है जो random.uniform(0, 1)पहली कॉल पर 0 लौटाता है
wm

जवाबों:


13

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

5

"कई बार" पर्याप्त नहीं है। 10,000 पर्याप्त नहीं है। random.uniform2 ^ 53 (9,007,199,254,740,992) विभिन्न मूल्यों में से चुनता है। आप उनमें से दो में रुचि रखते हैं। इस प्रकार, आपको एक मान प्राप्त करने से पहले कई क्वाड्रिलियन यादृच्छिक मान उत्पन्न करने की अपेक्षा करनी चाहिए जो कि ठीक 0 या 1 है। इसलिए यह संभव है, लेकिन यह बहुत संभावना है कि आप इसे कभी नहीं मानेंगे।


2
के लिए uniform(0, 1)यह है असंभव निर्माण करने के लिए 1परिणाम के रूप में। ऐसा इसलिए है क्योंकि फ़ंक्शन को केवल परिभाषित किया गया है def uniform(a, b): return a + (b - a) * random()और random()कभी भी उत्पादन नहीं कर सकता है 1.0
मार्टिन पीटर्स

2
@MartijnPieters मुझे विश्वास है कि आप सही हैं, और मैंने आपके उत्तर को गलत ठहराया। मुझे उतना ही संदेह था, लेकिन मुझे यकीन नहीं था, और यह मेरे जवाब के मुख्य जोर से अलग था, इसलिए मैंने इसे होने दिया :)
hobbs

1

आप कोशिश कर सकते हैं और एक लूप उत्पन्न कर सकते हैं जो एक निश्चित 0 (नहीं) दिखाने के लिए आवश्यक पुनरावृत्तियों की मात्रा को गिनता है।

इसके अलावा, जैसा कि हॉब्स ने कहा है, uniformlyसम्‍मिलित किए जा रहे मानों की मात्रा 9,007,199,254,740,992 है। जिसका अर्थ है कि 0 को देखने की संभावना 1 / 9,007,199,254,740,992 है। कौन से सामान्य शब्दों में और राउंडिंग का मतलब है कि आप को खोजने के लिए औसत 10 क्वैट्रिलियन नमूनों की आवश्यकता होगी 0. निश्चित रूप से आप इसे अपने पहले 10 प्रयासों में पा सकते हैं, या कभी नहीं।

एक नमूना लेना असंभव है क्योंकि मानों के लिए परिभाषित अंतराल एक कोष्ठक के साथ बंद है, इसलिए 1 शामिल नहीं है।


1

ज़रूर। uniform(0, 0.001)इसके बजाय आप पहले से ही सही रास्ते पर थे । बस सीमाओं को सीमित करने के लिए इसे जल्द ही बनाने के लिए पर्याप्त रखें।

>>> random.uniform(0., 5e-324)
5e-324
>>> random.uniform(0., 5e-324)
5e-324
>>> random.uniform(0., 5e-324)
0.0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.