我需要编写一个名为flip_coins(n)的函数来返回磁头数量。然后我需要编写一个程序,翻转8个硬币一千次,并返回头部连续三次带环的次数。之后,我对翻转的可能性进行了一些计算。到目前为止,这就是我所拥有的,但它不会运行。我错过了什么?
import random
def flip_coin():
return random.choice("HT")
def flip_coins(n):
for i in range(n):
if flip_coins() == "H":
heads_count +=1
return heads_count
for i in range (1000):
if flip_coins(8) == "3":
multiple_heads_count += 1
return multiple_heads_count
print(multiple_heads_probability)
print(second_probability)
multiple_heads_probability = multiple_heads_count/1000
second_probability = 56/256
答案 0 :(得分:1)
这很有趣,类似于我几个月前写的骰子滚动程序让我回到python中!
我注意到的第一件事是代码试图在创建它们之前打印两个变量,在分割整数时你也需要小心,它总是会返回一个整数,这意味着不首先转换为浮点数(使用float()
或将.0
添加到整数的末尾)结果将始终为零。所以我将这些行改为:
multiple_heads_probability = float(multiple_heads_count)/1000
second_probability = 56.0/256
print(multiple_heads_probability)
print(second_probability)
其次,如果您希望程序找到连续三次投掷头部的概率,那么我建议您在else
之后添加if flip_coin() == "H":
语句块。然后是另一个if
语句来确定是否连续有3个。另外,要添加到变量,您必须先初始化它们,您可以使用:heads_count = 0
执行此操作并稍后添加。所以我把你的第二个功能改为:
def flip_coins(n):
heads_count = 0
heads_rows = 0
for i in range(n):
if flip_coin() == "H":
heads_count +=1
else:
heads_count == 0
if heads_count == 3:
heads_rows += 1
heads_count = 0
else:
pass
return heads_rows
最后,for
循环。为什么在函数之外使用return
?这仅适用于编写富有成效(非空白)函数而不是循环(除非在富有成效的函数内)。在行if flip_coins(8) == "3":
中,您将整数与字符串进行比较,因此它将始终返回false。由于flip_coins()
的更改,我还以其他方式更改了for
循环,现在是:
multiple_heads_count = 0
for i in range (1000):
if flip_coins(8) >= 1: #if there were any occurrences of 3 heads (H) in a row
multiple_heads_count += 1
下面是经过纠正和完整的代码,以及10个可能的输出(数千个)。
代码:
import random
def flip_coin():
return random.choice("HT")
def flip_coins(n):
# initialize two variables for incrementation
heads_count = 0
heads_rows = 0
for i in range(n): # do n times
if flip_coin() == "H": # if flipped a heads
heads_count +=1 # increment heads_count by one
else: # otherwise
heads_count == 0 # reset heads_count
if heads_count == 3: # if there have been three heads so far
heads_rows += 1 # increment heads_rows by one
heads_count = 0 # reset heads_count
else: # otherwise
pass # do nothing
return heads_rows
multiple_heads_count = 0 # initialize a variable for incrementation
for i in range (1000): # do 1000 times
if flip_coins(8) >= 1: # if there was at least one three heads in a row
multiple_heads_count += 1 # increment multiple_heads_count by one
multiple_heads_probability = float(multiple_heads_count)/1000 # calculate the probability of having at least one heads in a row
second_probability = 56.0/256 # This is the supposed theoretical probability, however I have not checked this yet
print(multiple_heads_probability)
print(second_probability)
输出:
0.865
0.21875
0.851
0.21875
0.853
0.21875
0.861
0.21875
0.866
0.21875
0.89
0.21875
0.839
0.21875
0.856
0.21875
0.855
0.21875
0.841
0.21875
我对56.0/256
所代表的内容感到好奇,有人可以在评论中启发我吗?
答案 1 :(得分:0)
看起来你正在从内部调用“flip_coins”。你想从“flip_coins”里面调用“flip_coin”,如下所示:
def flip_coins(n):
for i in range(n):
if flip_coin() == "H": ## changed to flip_coin
heads_count +=1
return heads_count
编辑:这里还有几个问题。
在引用变量之前必须指定变量(即出现在=符号的左侧)(出现在要计算的表达式中)。这发生在函数“flip_coins”中,您需要在开始循环之前指定heads_count = 0。此外,在尝试在main中递增它之前,multip_heads_count永远不会被初始化(代码不在函数定义中)。最后,在分配之前,您尝试打印两个变量multiple_heads_probability和second_probability。
您错误地尝试将整数与循环中的字符串进行比较
for i in range (1000):
if flip_coin(8) == "3": ## changed to flip_coin()
multiple_heads_count += 1
flip_coin(8)的值是一个整数,但是您正在检查字符串“3”的相等性。字符串和整数永远不会相等。在这种情况下,只需删除3周围的引号。
你有一个函数
之外的return语句return multiple_heads_count
此声明可以删除。运行循环后,multiple_heads_count的值仍然可用,因为您仍然在相同的范围内,因此您可以将其打印出来或者根据需要使用它。
(编辑:注意 - 此段落适用于Python 2.x,但不适用于Python 3.x)一旦修复了这些语法错误,您就会发现结果始终打印“0”。那是因为在python中,两个整数的除法产生一个整数结果(商,其余的被抛弃)。在这种情况下,您总是将整数除以更大的整数,因此商始终为零。你想要的是划分整数并得到一个浮点结果,所以你可以通过指定商的至少一个元素作为浮点来强制python这样做:
multiple_heads_probability = multiple_heads_count/1000.0 ## added ".0"
您可以将“.0”添加到任何整数值,它将强制浮点除法。这是python需要注意的一个非常重要的特性。
最后,根据您的问题陈述,您的逻辑是错误的。您的问题表明您应该计算8个硬币翻转中“连续三个头”的实例,但是您的代码会计算8个中的所有头,并返回头的总数。现在,这里有一些含糊之处。你正在检查三个头,但问题是什么?即使你修改逻辑来寻找连续的头,你也会忽略“HHHH”,“HHHHH”等,因为你正在测试三个。另外,你是否应该把“HHHTTHHH”算作连续三个头的两个实例?
Python是一种很棒的语言,它是解决这类问题的绝佳选择。祝你好运!