2015-11-07 101 views
-1

我需要编写一个叫做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

为了提高时间表现(对于较大的情况),你可以[一次翻转许多硬币,例如,使用'random.getrandbits(nflips)']的结果(http://ru.stackoverflow.com/a/ 433050/23044) – jfs

回答

0

它看起来像你从它自己内部调用“flip_coins”。你想从“flip_coin”里面调用“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 

编辑:这里还有几个问题。

  1. 在引用变量(出现在要评估的表达式中)之前,必须指定变量(即出现在=符号的左侧)。这发生在函数“flip_coins”中,您需要在开始循环之前分配heads_count = 0。在尝试在主函数中增加它(而不是函数定义中的代码)之前,也不会初始化multiple_heads_count。最后,在分配它们之前,您正尝试打印两个变量multiple_heads_probability和second_probability。

  2. 您错误地试图比较字符串整数在循环

    for i in range (1000): 
        if flip_coin(8) == "3": ## changed to flip_coin() 
         multiple_heads_count += 1 
    

    flip_coin的值(8)是一个整数,但你检查字符串“3”的平等。字符串和整数永远不会相等。在这种情况下,刚刚从3

  3. 周围去掉引号你有一个return语句的功能

    return multiple_heads_count 
    

    此语句可以删除之外。运行循环后,multiple_heads_count的值仍然可用,因为您仍处于相同的范围内,因此您可以将其打印出来或根据需要使用它。

  4. 编辑:注意 - 本款适用于Python的2.X,但不是Python 3.x都有)一旦你解决这些语法错误,你会发现,你的结果总是打印“0”。这是因为在python中,两个整数的除法会产生一个整数结果(商数,其余的则被丢弃)。在这种情况下,你总是将一个整数除以一个更大的整数,所以商总是零。你想要的是划分整数,并得到一个浮点结果,这样你就可以强制蟒蛇由商的至少一个元素指定为浮点做到这一点:

    multiple_heads_probability = multiple_heads_count/1000.0 ## added ".0" 
    

    您可以添加” .0 “到任何整数值,它将强制浮点除法。这是python要注意的一个非常重要的特性。

  5. 最后,根据你的问题陈述,你的逻辑是错误的。你的问题指出,你应该计数8个硬币翻转中“连续三个头”的实例,但是你的代码计算出8个中的所有头,并返回总头数。现在,这里有一些含糊不清的地方。你正在检查三个头,但问题是这样的吗?即使你修正逻辑寻找连续的头部,你会忽略“HHHH”,“HHHHH”等,因为你正在测试三个。此外,你是否应该将“HHHTTHHH”算作连续三个头的两个实例?

Python是一门很棒的语言,它是这类问题的绝佳选择。祝你好运!

+0

我改变了,它仍然没有任何其他想法? – Crash917

+0

所以我尝试运行这个代码,这里有很多问题。我会试着解释他们。我不会为你写这段代码,因为这不是我们在堆栈溢出时所要做的。我们试着教你如何成为一名优秀的程序员并自己回答问题!我会用更多的信息更新我以前的答案。 – gariepy

+1

海报正在使用Python 3.默认情况下,Python 3中的分区是浮点。 –

1

这很有趣,类似于我几个月前写的一个骰子滚动程序,让我回到python!

我注意到的第一件事是代码试图在创建它们之前先打印两个变量,在分割整数时还需要小心,它总是会返回一个整数,这意味着不会转换为float首先(使用float()或将.0添加到整数的末尾),结果将始终为零。所以我改变者行:

multiple_heads_probability = float(multiple_heads_count)/1000 
second_probability = 56.0/256 

print(multiple_heads_probability) 
print(second_probability) 

其次,如果你希望程序找到一排抛头三次的概率,那么我建议你if flip_coin() == "H":块之后添加else声明。然后再判断一个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表示,可能有人开导我在评论?

+0

仍然在数学上工作,但很确定5​​6/256是预期的答案。 – gariepy

+0

@gariepy好的,我会看看,因为看起来理论概率应该更接近于实验概率。 – Oliver

+0

我编辑了包含注释代码的答案并解释了56/256的用途。 – Oliver