随机翻转一枚硬币

时间:2015-11-07 06:17:13

标签: python-3.x

我需要编写一个名为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

2 个答案:

答案 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

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

  1. 在引用变量之前必须指定变量(即出现在=符号的左侧)(出现在要计算的表达式中)。这发生在函数“flip_coins”中,您需要在开始循环之前指定heads_count = 0。此外,在尝试在main中递增它之前,multip_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中,两个整数的除法产生一个整数结果(商,其余的被抛弃)。在这种情况下,您总是将整数除以更大的整数,因此商始终为零。你想要的是划分整数并得到一个浮点结果,所以你可以通过指定商的至少一个元素作为浮点来强制python这样做:

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

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

  5. 最后,根据您的问题陈述,您的逻辑是错误的。您的问题表明您应该计算8个硬币翻转中“连续三个头”的实例,但是您的代码会计算8个中的所有头,并返回头的总数。现在,这里有一些含糊之处。你正在检查三个头,但问题是什么?即使你修改逻辑来寻找连续的头,你也会忽略“HHHH”,“HHHHH”等,因为你正在测试三个。另外,你是否应该把“HHHTTHHH”算作连续三个头的两个实例?

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