Python 滚动4个骰子1000次,并计算四个骰子之和的次数';分数等于或高于21分

Python 滚动4个骰子1000次,并计算四个骰子之和的次数';分数等于或高于21分,python,for-loop,while-loop,probability,dice,Python,For Loop,While Loop,Probability,Dice,因此,我正在学习Python中的随机性,并想通过制作一种“骰子模拟器”程序来测试我的知识,该程序可以抛出1000次四个“骰子”;然后计算四个骰子之和等于或大于21的次数。到目前为止,我得到的是: import random dice1 = random.randint(1,6) dice2 = random.randint(1,6) dice3 = random.randint(1,6) dice4 = random.randint(1,6) sum = dice1 + dice2 + di

因此,我正在学习Python中的随机性,并想通过制作一种“骰子模拟器”程序来测试我的知识,该程序可以抛出1000次四个“骰子”;然后计算四个骰子之和等于或大于21的次数。到目前为止,我得到的是:

import random

dice1 = random.randint(1,6)
dice2 = random.randint(1,6)
dice3 = random.randint(1,6)
dice4 = random.randint(1,6)

sum = dice1 + dice2 + dice3 + dice4

n = 0    # the amount of times the sum of the score was 21 or higher

for i in range(1000):
    dice1 = random.randint(1,6)
    dice2 = random.randint(1,6)
    dice3 = random.randint(1,6)
    dice4 = random.randint(1,6)

    for sum >= 21:
        n = n + 1

print("You got 21 or higher", n, "times.")

然而,程序的结果窗口只显示“你得到21次或更高的0次”或“你得到21次或更高的1000次”。所以,我想我的问题是:如何修复代码,使其计算出1000个“掷骰子”中分数总和为21或更高的次数,在结果窗口中打印所述次数,以及代码中需要修复的行(又名:哪里出错)?提前谢谢

不需要定义骰子,每个
random.randint(1,6)
本身就是一个骰子

import random

n = 0    # the amount of times the sum of the score was 21 or higher

for i in range(1000):
    sum = random.randint(1,6) + random.randint(1,6) + random.randint(1,6) + random.randint(1,6)

    if sum >= 21:
        n = n+1

print("You got 21 or higher", str(n), "times.")
这里有一个类似蟒蛇的方法:

dice_sum = [int((x/x)) for x in range(1,1001) if  random.randint(1,6) + random.randint(1,6) + random.randint(1,6) + random.randint(1,6) >= 21]

print("You got 21 or higher", str(sum(dice_sum)), "times.")

我所做的就是每次骰子
=21
时获取索引,然后将其除以相同的索引,使其返回列表中的1,然后获取列表的总和,即1添加到列表中的次数,这是骰子的数量
=21

您需要计算for循环中的骰子总数

在您的示例中,sum始终等于对
random.randint
的前4次调用中生成的随机数之和,但每次都应重新计算该和


此外,在sum>=21的
行中,
应替换为
if
<用于
的code>用于重复,如果用于条件执行,则使用。

您应该更新
for
-循环内的变量
sum
。否则,它将保留其初始值,即第一卷中四个骰子的总和

请注意,它们是一个名为
sum
的python内置函数,为变量使用内置名称是非常糟糕的做法。下面,我将变量重命名为
sumOfDice

随机导入
n=0#分数之和等于或大于21的次数
对于范围(1000)内的i:
dice1=random.randint(1,6)
dice2=random.randint(1,6)
dice3=随机的随机数(1,6)
dice4=随机的。随机数(1,6)
sumOfDice=dice1+dice2+dice3+dice4
如果sumOfDice>=21:
n=n+1
打印(“你得到21或更高”,n,“次”)
其他改进 当你开始有名字中有数字的变量时,你应该问自己:我真的需要四个骰子的命名变量吗?使用一个列表来保存这四个值不是更容易吗?如果
dice
是一个列表,那么您可以访问单个值,如
dice[0]
dice[1]
,等等。但是您也可以使用循环列表理解和其他很酷的python功能来操作列表。您甚至可以调用python内置的
sum
来获取列表的总和

随机导入
n=0
对于范围(1000)内的i:
骰子=[random.randint(1,6)表示范围(4)]
如果总和(骰子)>=21:
n=n+1
打印(“您得到21次或更高,{}次。”.format(n))

我解决了这个问题。你能试试这个吗

import random

n = 0   

for i in range(1000):
    dice1 = random.randint(1,6)
    dice2 = random.randint(1,6)
    dice3 = random.randint(1,6)
    dice4 = random.randint(1,6)
    sum = dice1 + dice2 + dice3 + dice4
    if sum >= 21:
        n = n + 1

print("You got 21 or higher", n, "times.")

您确定您为sum>=21:编写了
?这不是有效的python语法。如果
,则的
应该是
。另一个问题是,您忘记更新
for
-循环中的变量
sum
,因此它保留其初始值(第一次掷骰时四个骰子的总和)。您没有更新for循环中的sum,顺便说一句,避免使用此名称,因为它会对N个骰子掷骰列表的内置sum+1进行阴影处理。在这种特殊情况下,我们甚至可以编写
rolls\u sum=4*random.randint(1,6)
,因为平均结果是相同的。@Guimoute这是错误的。我们对平均结果不感兴趣,我们正在计算结果超过21的次数。想象一下,如果我掷一枚硬币,一边是“0”,另一边是“10”,然后问你“值大于7的次数是多少?”0和10的平均值是5,5永远不会超过7。然而正确的答案应该是翻转次数的一半。啊,我明白了!感谢您的输入和关于高效python特性的提示!我觉得现在实现上述功能对我来说可能有点过头了,因为我刚刚开始用Python编写代码,但我一定会记住这一点,以备将来在使用该语言时更加舒适一些!:-)@准实时即使你是初学者,我仍然建议使用
dice=[random.randint(1,6)for uu范围(4)];sumOfDice=dice[0]+dice[1]+dice[2]+dice[3]
而不是非常重复的
dice1=random.randint(1,6);dice2=随机随机随机数(1,6);dice3=随机随机随机数(1,6);dice4=随机随机随机数(1,6);sumOfDice=dice1+dice2+dice3+dice4
。啊,我看到for循环中的总和定义是我所缺少的。。。现在我添加了它,它运行得非常好,谢谢你,岑克!:D