2010-02-01 11 views
14

क्या पाइथन की यादृच्छिक। यादृच्छिक() कभी 1.0 लौटाती है या क्या यह केवल 0.9999 तक वापस आती है ..?मानक लाइब्रेरी से पाइथन के random.random() की रेंज

+2

उनमें सोने की पहाड़ी है। यादृच्छिक (रैंडम) रिटर्न के बारे में एक प्रश्न के लिए 42 अंक (और गिनती)। <उपयुक्त विस्मयादिबोधक डालें> – telliott99

+5

ध्यान दें कि यदि आप अपना अनुक्रम 0.9 999 समाप्त नहीं करते हैं तो यह वास्तव में 1.0 के बराबर है। –

उत्तर

19

डॉक्स यहां हैं: http://docs.python.org/library/random.html

... यादृच्छिक() है, जो अर्द्ध खुले क्षेत्र [0.0, 1.0) में समान रूप से एक यादृच्छिक नाव उत्पन्न करता है।

तो, वापसी मूल्य 0 से अधिक या 1.0 से कम होगा, और 1.0 से कम होगा।

+8

ब्रैकेट/माता-पिता रेंज अंकन की एक विवरण के लिए लिखने में कोई गलती थी सोचा यहाँ देखो: http: //en.wikipedia। संगठन/विकी/अंतराल_ (गणित) # शब्दावली –

+1

मुझे लगता है कि पाइथन की आंतरिक सहायता प्रणाली (जैसा कि किसी अन्य उत्तर में उल्लिखित है) जब आप पाइथन में प्रोग्रामिंग कर रहे हैं तो यह तुरंत अधिक सुलभ है। 'मदद (यादृच्छिक। यादृच्छिक)' ओपी को ओपी को आवश्यक जानकारी दी गई थी। – Omnifarious

+0

जब आप किसी वेबपृष्ठ पर लिख रहे हों तो वास्तविक दस्तावेज़ से लिंक करना बेहतर होता है। –

10

पायथन का random.random फ़ंक्शन रिटर्न संख्याएं जो कम से कम हैं, लेकिन 1 के बराबर नहीं हैं।

हालांकि, यह 0 वापस कर सकता है।

+1

यादृच्छिक() -> एक्स अंतराल में [0, 1) है, जिसमें 0. – telliott99

+4

@ telliott99 शामिल है: यह (लगभग) बिल्कुल मैंने जो कहा है। – SLaks

+1

+1 एकमात्र उत्तर होने के लिए विज्ञान-विज्ञान गणित नोटेशन पर भरोसा न करें! –

32
>>> help(random.random) 
Help on built-in function random: 

random(...) 
    random() -> x in the interval [0, 1). 

इसका मतलब है 1 को बाहर रखा गया है।

+9

मुझे आपका जवाब सबसे अच्छा लगता है। पायथन में एक शानदार आंतरिक सहायता प्रणाली है और लोगों को इसका उपयोग करने के लिए प्रोत्साहित किया जाना चाहिए। – Omnifarious

11

अन्य उत्तरों पहले से ही स्पष्ट हैं कि 1 श्रेणी में शामिल नहीं है, लेकिन जिज्ञासा से, मैंने यह देखने के लिए स्रोत को देखने का फैसला किया कि इसकी गणना कैसे की जाती है।

CPython स्रोत पाया जा सकता है here

/* random_random is the function named genrand_res53 in the original code; 
* generates a random number on [0,1) with 53-bit resolution; note that 
* 9007199254740992 == 2**53; I assume they're spelling "/2**53" as 
* multiply-by-reciprocal in the (likely vain) hope that the compiler will 
* optimize the division away at compile-time. 67108864 is 2**26. In 
* effect, a contains 27 random bits shifted left 26, and b fills in the 
* lower 26 bits of the 53-bit numerator. 
* The orginal code credited Isaku Wada for this algorithm, 2002/01/09. 
*/ 
static PyObject * 
random_random(RandomObject *self) 
{ 
    unsigned long a=genrand_int32(self)>>5, b=genrand_int32(self)>>6; 
    return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0)); 
} 

तो समारोह को प्रभावी ढंग से m/2^53 उत्पन्न करता है जहां 0 <= m < 2^53 एक पूर्णांक है। चूंकि फ्लोट्स में सामान्य रूप से 53 बिट सटीक होते हैं, इसका मतलब है कि सीमा [1/2, 1) पर, हर संभव फ्लोट उत्पन्न होता है। 0 के करीब के मानों के लिए, यह दक्षता के लिए कुछ संभावित फ्लोट मानों को छोड़ देता है लेकिन उत्पन्न संख्याओं को समान रूप से श्रेणी के भीतर वितरित किया जाता है। सबसे बड़ा संभव random.random द्वारा उत्पन्न नंबर कोड एंटीमनी के जवाब में यह है कि random.random देखने के लिए() प्लेटफॉर्म है कि गणना के लिए कम से कम 53 बिट अपूर्णांश पर वास्तव में 1.0 कभी नहीं देता है आसान है से ठीक

0,99999999999999988897769753748434595763683319091796875

+1

+1 सबसे बड़ी संभव फ्लोट के लिए! –

+1

यदि उपर्युक्त सी कोड -फिंगल-परिशुद्धता-स्थिर के साथ संकलित किया गया है, तो यह 1.0 उत्पन्न कर सकता है। विवरण के लिए मेरा जवाब देखें –

2

है जिसमें स्थिरांक शामिल हैं, सी में 'एफ' के साथ एनोटेट नहीं किया गया है। यह सटीक आईईईई 754 निर्धारित करता है और आज मानक है।

हालांकि, कम परिशुद्धता वाले प्लेटफार्मों पर, उदाहरण के लिए यदि पाइथन को एम्बेडेड प्लेटफॉर्म पर उपयोग के लिए -फिंगल-सटीक-स्थिरांक के साथ संकलित किया गया है, तो * 67108864.0 पर बी जोड़ना परिणामस्वरूप 2^53 तक हो सकता है यदि बी है 2^26 तक पर्याप्त बंद करें और इसका मतलब यह होगा कि 1.0 वापस आ गया है। ध्यान दें कि इस पर ध्यान दिए बिना कि सटीक पायथन के PyFloat_FromDouble फ़ंक्शन का क्या उपयोग होता है।

इसके लिए परीक्षण करने का एक तरीका कुछ सौ यादृच्छिक संख्याओं की जांच करना होगा कि 53 वें बिट कभी भी 1 है या नहीं। यदि यह सबूत कम से कम एक बार पर्याप्त होता है और आप ठीक हैं। यदि नहीं, तो गोलाकार सबसे संभावित स्पष्टीकरण है जिसका मतलब है कि random.random() 1.0 वापस कर सकता है। यह निश्चित रूप से संभव है कि आप बस दुर्भाग्यपूर्ण थे। आप अधिक संख्याओं का परीक्षण करके निश्चित रूप से जितना चाहें उतना उच्च दबाव डाल सकते हैं।

संबंधित मुद्दे