我被要求模拟滚动两个公平的骰子,侧面1-6。所以可能的结果是2-12。
我的代码如下:
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)次的总和。
有人对我有任何建议吗?
答案 0 :(得分:5)
在循环中滚动骰子 :
def dice(n):
total = 0
for i in range(n):
total += random.randint(1, 6)
return total
+=
扩充赋值运算符在求和整数时基本上与total = total + random.randint(1, 6)
相同(它稍微复杂一点,但这只对列表等可变对象有用)。
您甚至可以使用generator expression和sum()
function:
def dice(n):
return sum(random.randint(1, 6) for _ in range(n))
这与第一个例子中的for
循环基本相同;循环n
次,总结了1到6之间的许多随机数。
如果不是滚动n
次,而是需要生成2个骰子滚动的n
个结果,您仍需要在循环中滚动,并且需要将结果添加到列表中:< / p>
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
也可以更紧凑地写出来
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