我正在尝试玩两个掷骰子的游戏。该游戏包含500发子弹。在每一轮中,两个硬币同时被滚动,如果两个硬币都有“头”,那么我们赢得1英镑,如果两个都有“尾巴”,那么我们将损失1英镑,如果我们有一个硬币显示'头'和另一个硬币显示'尾巴'或反之亦然然后我们只是'再试一次'。我试图打印最终结果20次,但是'while循环'似乎不起作用,我哪里出错了?
coin_one = [random.randint(0, 1) for x in range(500)] #flips coin 1 heads or tails 500 times
coin_two = [random.randint(0, 1) for x in range(500)] #flips coin 2 heads or tails 500 times
game = zip(coin_one, coin_two)
def coin_toss_game1():
total = 0
for coin_one, coin_two in game:
if coin_one and coin_two:
total += 1 #if both coin one and two return heads then we win $1
elif not a and not b:
total -= 1 #if both coin one and two return tails then we lose $1
else:
continue #if coin one returns heads and coin two returns tails then we try again
return total
y = 0
while y < 21:
print(coin_toss_game1()) #This is where I am encountering problems with printing result 20 times
y += 1
这给出了以下结果: 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
它应该返回类似的结果:7 2 -5 15 -9 12 ... 我在这里犯了什么错误?
答案 0 :(得分:3)
这里有两个问题。
zip
对象在Python 3中(我假设你根据你的结果使用它),zip()
返回一个生成器。生成器只能迭代一次。如果您尝试再次迭代它,它将为空。这就是为什么超出第一个结果的所有结果都回归为零......他们实际上并没有做任何事情。
如果你只是修复,但是,你仍然会遇到问题...所有20次运行都会产生相同的结果。
您在程序顶部生成了一次硬币翻转,然后尝试在所有20轮中使用相同的序列。所有结果都是一样的,这并不奇怪。
两个问题的解决方法是相同的:将硬币翻转和zip
ping生成移动到函数中,以便每次运行时都重做:
def coin_toss_game1():
coin_one = [random.randint(0, 1) for x in range(500)]
coin_two = [random.randint(0, 1) for x in range(500)]
game = zip(coin_one, coin_two)
total = 0
for coin_one, coin_two in game:
...
顺便说一句,用于循环固定次数的更简单的Python习语是:
for _ in range(20): # Nothing magical about the underscore... it's just a dummy variable
print(coin_toss_game1())
答案 1 :(得分:0)
我认为这是您正在寻找的代码:
def coin_toss_game1():
coin_one = [random.randint(0, 1) for x in range(500)]
coin_two = [random.randint(0, 1) for x in range(500)]
game = zip(coin_one, coin_two)
total = 0
for a, b in game:
if a and b:
total += 1
elif not a and not b:
total -= 1
else:
continue
return total
y = 0
while y < 21:
print(coin_toss_game1())
y += 1
你拥有的代码运行游戏一次(500回合)而不是20次。上面的代码,每次while
循环的迭代,运行500轮并显示结果。所以你得到了500轮比赛的结果,20次。