在Python中模拟滚动2个骰子

A.B*_*and 1 python random python-3.x

我被要求模拟滚动两个公平的骰子,侧面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
Run Code Online (Sandbox Code Playgroud)

我的问题是,这只是返回掷骰子1次的结果,所以结果总是2-12.我希望它返回滚动骰子(n)次的总和.

有人对我有什么建议吗?

Mar*_*ers 5

在循环中掷骰子:

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

+=增强赋值运算符基本上可以归结为同样的事情,total = total + random.randint(1, 6)总结整数时(这是比稍微复杂一些,但对于像列表可变对象,只有事项).

你甚至可以使用生成器表达式sum()函数:

def dice(n):
    return sum(random.randint(1, 6) for _ in range(n))
Run Code Online (Sandbox Code Playgroud)

这基本上for与第一个例子中的循环相同; 循环n时间,总结了1到6之间的许多随机数.

如果不是滚动n时间,您需要生成n2个骰子滚动的结果,您仍然需要在循环中滚动,并且您需要将结果添加到列表中:

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
Run Code Online (Sandbox Code Playgroud)

这也可以通过列表理解更紧凑地写出来:

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

您还可以使用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)]
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都会得到一个包含n结果的列表:

>>> dice(5)
[10, 11, 6, 11, 4]
>>> dice(10)
[3, 7, 10, 3, 6, 6, 6, 11, 9, 3]
Run Code Online (Sandbox Code Playgroud)

您可以将列表传递给print()函数以将这些列表打印在一行或单独的行上:

>>> print(*dice(5))
3 7 8 6 4
>>> print(*dice(5), sep='\n')
7
8
7
8
6
Run Code Online (Sandbox Code Playgroud)