python的random.random()曾經返回1.0還是隻返回到0.9999 ..?python的random.random()從標準庫的範圍
回答
文檔在此:http://docs.python.org/library/random.html
...隨機(),它在 均勻 生成隨機浮子半開區間[0.0,1.0)。
因此,返回值將大於或等於0,並小於1.0。
有關括號/父範圍表示法的解釋,請看這裏:http://en.wikipedia。 org/wiki/Interval_(數學)#Terminology –
我認爲當你使用Python進行編程時,Python的內部幫助系統(如另一個答案中提到的)更容易被訪問。 'help(random.random)'會給OP提供他需要的信息。 – Omnifarious
當你在網頁上寫作時,鏈接到真實文檔要好得多。 –
Python的random.random
函數返回小於但不等於1
的數字。
但是,它可以返回0
。
random() - > x在區間[0,1) 即包括0. – telliott99
@ telliott99:這(幾乎)正是我所說的。 – SLaks
+1是唯一不依賴科幻數學符號的答案! –
>>> help(random.random)
Help on built-in function random:
random(...)
random() -> x in the interval [0, 1).
這意味着排除1。
我最喜歡你的回答。 Python有一個很棒的內部幫助系統,應該鼓勵人們使用它。 – Omnifarious
其他答案已經明確了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
產生儘可能多的恰恰是
0.99999999999999988897769753748434595763683319091796875
+1對於最大可能的浮點數! –
如果上面的C代碼是用-fsingle-precision-constant編譯的,則可以得到1.0。詳情請參閱我的回答 –
從銻的答案很容易看出,random.random()從來沒有準確的1.0返回上有計算至少53位尾數平臺的代碼涉及在C中未用'f'註解的常量。這就是IEEE 754規定的精度,今天是標準。
但是,在精度較低的平臺上,例如,如果在嵌入式平臺上使用-fsingle-precision-constant編譯Python,將b添加到* 67108864.0會導致舍入爲2^53,如果b爲足夠接近2^26,這意味着返回1.0。請注意,無論Python的PyFloat_FromDouble函數使用什麼精度,都會發生這種情況。
測試這種方法的一種方法是檢查幾百個隨機數是否第53位是1.如果它至少有1次,這證明了足夠的精度,你很好。如果不是,舍入是random.random()可以返回1.0的最可能的解釋。當然可能你只是不幸。您可以通過測試更多數字來將確定性提高到您想要的水平。
- 1. VLOOKUP範圍內的標準
- 2. 細胞範圍COUNTIFS標準
- 3. Python從範圍
- 4. Python標準庫真的是標準嗎?
- 5. 將範圍內的值標準化
- 6. 可調整的Excel範圍與標準?
- 7. Rails的添加範圍Mongoid標準
- 8. 標準化[0 -1]範圍內的值
- 9. 的Python:從標準
- 10. 什麼是解決標準庫範圍的路徑
- 11. 的Python random.random - 滾動0
- 12. Python的範圍
- 13. 從基於動態標準的範圍獲得最大值
- 14. Excel,SUMIFS標準範圍也是總和範圍
- 15. 範圍標準化(0到1)
- 16. @組件彈簧註釋標準範圍
- 17. 塊範圍鏈接C標準
- 18. sql服務器日期範圍標準
- 19. mod_wsgi python無法從標準庫導入
- 20. 將「180-360」的數據範圍標準化到「0-100」範圍 - jQuery/JS
- 21. Python:其中是random.random()播種?
- 22. 是否有可用的基於全範圍的標準庫實現?
- 23. 從th範圍標記中隱藏範圍標題
- 24. 尋找Python標準庫
- 25. 標準Python庫和Unicode
- 26. 未安裝Python標準庫?
- 27. 是否有標準的Python類在浮點範圍上執行布爾運算?
- 28. 帶範圍標準的連接表上的MySQL優化
- 29. COUNTIFS與不同的表範圍的標準
- 30. 如何確定給定標準的連續範圍的大小?
在他們的丘陵中有黃金。有關random.random()返回結果的問題,請指出42分(和計數)。 <插入合適的感嘆號> – telliott99
注意,如果你沒有終止你的序列0.9999,它實際上等於1.0。 –