在Python中模拟滚动2个骰子

时间:2015-10-11 19:56:22

标签: python python-3.x random

我被要求模拟滚动两个公平的骰子,侧面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)次的总和。

有人对我有任何建议吗?

1 个答案:

答案 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 expressionsum() 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

使用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