我一直覺得random.randint(a, b)
會返回一個範圍爲[a, b]
的整數,而不是[a, b-1]
,比如range(...)
。Python:爲什麼`random.randint(a,b)`返回包含`b`的範圍?
這有明顯的不一致性嗎?
我一直覺得random.randint(a, b)
會返回一個範圍爲[a, b]
的整數,而不是[a, b-1]
,比如range(...)
。Python:爲什麼`random.randint(a,b)`返回包含`b`的範圍?
這有明顯的不一致性嗎?
我試圖通過檢查一些舊的來源來了解這一點。我懷疑這是randint
之前Python的長整數來實現的:這意味着,如果你想,包括INT_MAX
一個隨機數,你會需要調用random.randrange(0, INT_MAX + 1)
這將溢出並導致(0, 0)
或(0, INT_MIN)
根據的論點。
然而,尋找遠在即使the Python 1.5.2 sources,在Lib/whrandom.py
我們看到:
#
# Get a random integer in the range [a, b] including both end points.
# (Deprecated; use randrange below.)
#
def randint(self, a, b):
return self.randrange(a, b+1)
whrandom.randint
繼續在2.0被棄用,2.1,2.2,並2.3;但random.randint
已在2.1中標記爲已棄用,但不再在2.2中標記爲已棄用。
而且,random.py
from version 2.1是第一個在random.randint
的文檔字符串注意:
def randrange(self, start, stop=None, step=1, int=int, default=None):
"""Choose a random item from range(start, stop[, step]).
This fixes the problem with randint() which includes the
endpoint; in Python this is usually not what you want.
Do not supply the 'int' and 'default' arguments.
"""
唯一可用的源比舊款the 0.9.1 source,而據我所知,randint
並沒有在這一點上實施。因此,我得出結論:randint
包括的推理在此時只有Guido本人已知;鑑於來自Python 2.1的文檔字符串,這聽起來像是原因可能是一個簡單的錯誤。
+1爲了努力研究這一點,並提供了一些有趣的觀察。 – 2010-04-02 21:22:08
是的,這是一個很好的答案。非常感謝! – 2010-04-03 04:53:46
也許randint規範來自另一種語言? – 2010-04-03 10:49:12
我不認爲這是有原因的。但至少它有記錄。
+1:原因並不重要。即使它沒有記錄,它仍然沒有關係。 – 2010-04-03 02:48:53
我猜random.randint
只是實現此功能的第一次嘗試。看來,Python開發也認爲,這是一個問題,這就是爲什麼在V1.5.2它們加入的另一種方法randrange與多個標準參數:
random.randrange([start], stop[, step])
返回從範圍內的隨機選擇的元件(啓動,停止,一步)。這相當於選擇(範圍(開始,停止,步驟)),但實際上並不構建範圍對象。
您可以使用randrange
而不是randint
來避免令人驚訝的人。另一方面,在許多情況下,問題的表述爲'選擇1和6之間的隨機數',使用randint(1, 6)
而不是編寫randrange(1, 7)
或randrange(min, max + 1)
可能更自然。
這是猜測,但'給我一個隨機數從a到b'的正常人類使用是包容性的。鑑於Python的一般理念是可讀性更高的語言,以這種方式實現它是有道理的。
(不回答問題:)那麼,你可以使用'randrange'。 – kennytm 2010-04-02 19:40:26
也許我只是沒有你那麼聰明,但我不認爲它是不一致的。我認爲它只是爲程序員提供了一種方法,用於調用一個包含隨機數字而不需要使用運算符和幻數。更好的語言爲他們的用戶提供了創造性的途徑。 – Musixauce3000 2016-04-29 13:45:26
@ Musixauce3000這是不一致的,因爲'range'和'randint'這兩個方法都接受相同的邏輯值(即一個數字範圍),但是這個值是以兩種不同的 - 不一致的方式指定的(即包含一個的端點,另一個是排他性的)。 – 2016-04-29 20:20:44