2010-04-02 274 views
32

我一直覺得random.randint(a, b)會返回一個範圍爲[a, b]的整數,而不是[a, b-1],比如range(...)Python:爲什麼`random.randint(a,b)`返回包含`b`的範圍?

這有明顯的不一致性嗎?

+6

(不回答問題:)那麼,你可以使用'randrange'。 – kennytm 2010-04-02 19:40:26

+0

也許我只是沒有你那麼聰明,但我不認爲它是不一致的。我認爲它只是爲程序員提供了一種方法,用於調用一個包含隨機數字而不需要使用運算符和幻數。更好的語言爲他們的用戶提供了創造性的途徑。 – Musixauce3000 2016-04-29 13:45:26

+0

@ Musixauce3000這是不一致的,因爲'range'和'randint'這兩個方法都接受相同的邏輯值(即一個數字範圍),但是這個值是以兩種不同的 - 不一致的方式指定的(即包含一個的端點,另一個是排他性的)。 – 2016-04-29 20:20:44

回答

64

我試圖通過檢查一些舊的來源來了解這一點。我懷疑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.12.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的文檔字符串,這聽起來像是原因可能是一個簡單的錯誤。

+4

+1爲了努力研究這一點,並提供了一些有趣的觀察。 – 2010-04-02 21:22:08

+0

是的,這是一個很好的答案。非常感謝! – 2010-04-03 04:53:46

+0

也許randint規範來自另一種語言? – 2010-04-03 10:49:12

3

我不認爲這是有原因的。但至少它有記錄。

+1

+1:原因並不重要。即使它沒有記錄,它仍然沒有關係。 – 2010-04-03 02:48:53

10

我猜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)可能更自然。

6

這是猜測,但'給我一個隨機數從a到b'的正常人類使用是包容性的。鑑於Python的一般理念是可讀性更高的語言,以這種方式實現它是有道理的。

相關問題