2015-10-11 159 views
0

我被要求模擬滾動兩個公平的骰子與邊1-6。所以可能的結果是2-12。在Python中模擬滾動2個骰子

我的代碼如下:

def dice(n): 
    x=random.randint(1,6) 
    y=random.randint(1,6) 
    for i in range(n): 
     z=x+y 
    return z 

我的問題是,這只是返回擲骰子1次的結果,所以結局永遠是2-12。我希望它返回擲骰子(n)次的總和。

有沒有人對我有任何建議?

回答

4

殘疾人專用迴路骰子

def dice(n): 
    total = 0 
    for i in range(n): 
     total += random.randint(1, 6) 
    return total 

+=增強賦值運算符基本總結整數時(這是稍微比這更復雜,但只有問題歸結爲同樣的事情total = total + random.randint(1, 6)用於像列表這樣的可變對象)。

你甚至可以使用generator expressionsum() function

def dice(n): 
    return sum(random.randint(1, 6) for _ in range(n)) 

這基本上做同樣的事情在第一個例子中for循環;循環n次,總結出1到6之間的許多隨機數。

如果不是滾動n時候,你需要製作n結果2次擲骰,你仍然需要在循環滾動,你需要將結果添加到列表中:

def dice(n): 
    rolls = [] 
    for i in range(n): 
     two_dice = random.randint(1, 6) + random.randint(1, 6) 
     rolls.append(two_dice) 
    return rolls 

這也可以更緊湊寫出來,與list comprehension

def dice(n): 
    return [random.randint(1, 6) + random.randint(1, 6) for _ in range(n)] 

你也可以使用random.choice()從產生的款項清單;這些自動加權正確;這基本上是預先計算的36個可能的骰子值(11唯一的),每次以相同的概率:

from itertools import product 

two_dice_sums = [a + b for a, b in product(range(1, 7), repeat=2)] 

def dice(n): 
    return [random.choice(two_dice_sums) for _ in range(n)] 

無論哪種方式,你會得到一個清單,n結果:

>>> dice(5) 
[10, 11, 6, 11, 4] 
>>> dice(10) 
[3, 7, 10, 3, 6, 6, 6, 11, 9, 3] 

你可以通過有這些印上一條線,或在單獨的行列表中print()功能:

>>> print(*dice(5)) 
3 7 8 6 4 
>>> print(*dice(5), sep='\n') 
7 
8 
7 
8 
6 
+0

好吧,讓我重新整理,而不是返回骰子羅爾的總和我原來的問題, d(n)次,我需要爲每卷打印2個骰子的總和。所以如果擲骰子(n = 10)次,那麼該函數需要返回類似於10,8,9,7,4,10,12,6,3,5 –

+1

@ A.Boland:*返回*,或*打印*?有一個很大的不同。 –