2010-08-22 19 views
29

,我知道randrangerandint之間的唯一區別是, randrange([start], stop[, step])您可以使用步驟和random.randrange(0,1)不會考慮的最後一個項目,而randint(0,1)返回的最後一個項目的選擇包容性。差Vs randrange

所以,我找不到解釋爲什麼randrange(0,1)不返回0或1的原因,爲什麼存在randint(0, 1)randrange(0, 2)代替randrange(0, 1)誰返回0或1?

+0

相關:http://stackoverflow.com/questions/2568783/python-why-does-random-randinta-b-return-a-range-inclusive-of-b/2568917#2568917 – kennytm 2010-08-22 08:00:37

+0

你有兩個值你想要返回並且2-0 = 2(2不包括在範圍內)。範圍數(a,b)始終是ba,並且通常最清晰的寫入範圍是範圍(a,a + count) – 2010-08-22 13:22:29

回答

35

上randrange的文檔說:

random.randrange([start], stop[, step])

返回從range(start, stop, step)隨機選擇的元素。 這相當於choice(range(start, stop, step)),但實際上並不構建範圍對象。

而範圍(開始,停止)返回[start, start+step, ..., stop-1],而不是[start, start+step, ..., stop]。至於爲什麼......基於零的計數規則和range(n)應該返回n個元素,我想。我猜想,對獲取隨機索引最有用。

雖然randint被記錄爲:

random.randint(a, b)

返回一個隨機整數N,從而使得a <= N <= b別名randrange(a, b+1)

所以randint是當你有你想要的隨機數的最大值和最小值。

+3

[The docs](http://docs.python.org/library/random.html)似乎沒有說'randint'是'randrange(a,b + 1)'的別名。這是真的嗎?如果後者被用來代替'randint'看看它是如何在引擎蓋下相同的?調用'randint'有額外的開銷嗎? – Whymarrh 2012-09-18 19:24:20

+0

@Whymarrh這篇文章是兩年過時了。我找不到我引用的那段文字,但我確信我沒有補足。至於兩者之間的選擇,'randint'更簡單,更直觀,因此我會在適用的時候推薦它,我認爲不存在可衡量的性能差異,並且我強烈反對關心這些事情。使用更清晰的東西。如果一個額外的函數調用會傷害你,你不應該使用Python。或者任何語言的大多數圖書館,就此而言。 – delnan 2012-09-18 19:29:24

+0

我並不是想暗示這個陳述是捏造的。我對這門語言很陌生,只是好奇而已。 (我認爲這些文檔也發生了兩年的變化)。我感謝你的回覆,'randint'更清晰,更直觀。 – Whymarrh 2012-09-18 19:36:32

2

他們兩個之間的區別是,當你知道這兩個區間的界限randint才能使用。 如果您只知道區間randint的第一個限制會返回錯誤。在這種情況下,您可以使用randrange只有一個間隔,它將工作。 嘗試運行下面的代碼與隨機三角形填充屏幕:

import random 
from tkinter import * 

tk = Tk() 
canvas = Canvas(tk, width=400, height=400) 
canvas.pack() 

def random_triangle(l1,l2,l3,l4,l5,l6): 
    x1 = random.randrange(l1) 
    y1 = random.randrange(l2) 
    x2 = x1 + random.randrange(l3) 
    y2 = y1 + random.randrange(l4) 
    x3 = x2 + random.randrange(l5) 
    y3 = y2 + random.randrange(l6) 
    canvas.create_polygon(x1,y1,x2,y2,x3,y3) 

for x in range(0, 100): 
    random_triangle(300,400,200,500,400,100) 

嘗試使用randint功能再次運行上面的代碼。你會看到你會得到一個錯誤信息。