当前位置: 首页 > 知识库问答 >
问题:

用python分析投掷硬币的统计量

杜俊远
2023-03-14

我一直在edX上学习python编程,这是一门非常好的课程,目前为止我可以完全推荐。刚刚看了一场关于统计学的TED演讲,我觉得很棒,这是我在真实世界场景中学会的一种锻炼python技能的简单方法。这个家伙给出了一个关于不断地抛硬币并寻找两个重复序列的概率的例子,他解释说,你会认为这两个序列发生的概率与他声称的相同,事实上并非如此。简单地说,他声称Heads Tails Heads这个序列比Heads Tails Tails更有可能出现,因为在第一个序列的末尾,你已经有三分之一的时间重复这个序列,在第二个序列的末尾,你必须再抛一个头来重新开始这个序列。这是完全有道理的,所以我开始尝试用这里展示的小python程序来证明这一点。

import random

HTH = 0
HTT = 0
myList = []
i = 0
numberOfTosses = 1000000

while i < numberOfTosses:
    myList.append(random.randint(0,1))
    i += 1

for i in range (len(myList)):

    if i+2 >= len(myList):
        break

    if myList[i] == 1 and myList[i+1] == 0 and myList[i+2] == 1:
        HTH +=1

    if myList[i] == 1 and myList[i+1] == 0 and myList[i+2] == 0:
        HTT +=1

print 'HTT :' ,numberOfTosses, HTT, numberOfTosses/HTT
print 'HTH :' ,numberOfTosses, HTH, numberOfTosses/HTH

所以我运行了这个程序很多次,并且把最大迭代值改得越来越高,但似乎不能证明他的说法,即平均每进行8次迭代就会出现第h个序列,而每进行10次迭代就会出现HTT序列,因为不管是哪种方式,我都能得到平均平衡的结果。所以我的问题是,我在执行问题时哪里出了问题?

共有1个答案

章盛
2023-03-14

你的专家是对的,你的代码对你的陈述他说的是对的,但他实际上说了一些别的东西。他说,当你开始掷硬币时,你应该期望看到HTT在平均8次掷硬币时首先出现,而HTH在平均10次掷硬币时首先出现。

如果您修改程序以测试该断言,它可能如下所示:

import random

HTH = 0
HTT = 0
numberOfTrials = 10000

for t in xrange( numberOfTrials ):
    myList = [ random.randint(0,1), random.randint(0,1), random.randint(0,1) ]
    flips = 3
    HTHflips = HTTflips = 0

    while HTHflips == 0 or HTTflips == 0:
        if HTHflips == 0 and myList[flips-3:flips] == [1,0,1]:
            HTHflips = flips
        if HTTflips == 0 and myList[flips-3:flips] == [1,0,0]:
            HTTflips = flips
        myList.append(random.randint(0,1))
        flips += 1

    HTH += HTHflips
    HTT += HTTflips


print 'HTT :', numberOfTrials, HTT, float(HTT)/numberOfTrials
print 'HTH :', numberOfTrials, HTH, float(HTH)/numberOfTrials

运行该操作将确认8和10次抛物的期望值。

 类似资料:
  • 所以尝试做一个掷硬币游戏的模拟,如果你得到人头,你的钱就翻倍,如果你有故事,你的钱就翻倍。并且想看看如果你用x个钱开始投n个球后你会得到什么 然而,我不确定如何以一种干净的方式来解决这个问题,而不只是对n执行一个forloop。 有什么干净的方法可以做到这一点吗?

  • 我只能用randint(0,1),它的抛硬币。(50%的头,尾) 使用上面,我如何做骰子分布(1到6个均匀分布)。

  • 有人可以解释我什么时候使用关键字 throw new 有用.而不是在方法的签名旁边使用抛出? 我知道当方法抛出Checked Exception时。Java迫使我们通过将Exception处理到try-catch块中,或者通过在签名旁边的关键字throws指定将在其他地方完成,从而直接在方法中处理它。 然而,我很难理解何时使用关键字throw new是有用的,以及为什么。它与处理未选中的异常有关吗

  • 我在视图中有一个ImageView,并尝试用它显示一个WritableImage实例。我正在外线程中绘制它,并通过侦听ObjectProperty的更改事件将其传递给视图。 imageView应该准备好接收图像,它由我的主视图显示。但是这是一个不合法的例外 线程“Thread-4”Java . lang . illegalstateexception中的异常:不在FX应用程序线程上;当前线程=线程

  • 我试图自己解决LeetCode问题322。硬币兑换: 您将获得一个整数数组,表示不同面额的硬币,以及一个整数金额,表示总金额。 返回您需要的最少数量的硬币,以弥补该金额。如果这些硬币的任何组合都无法弥补这一数额,则返回-1。 你可以假设每种硬币的数量是无限的。 我似乎有一个错误,无法找出它。 我用DFS解决,基本上是说当目标达到0时,只需将所有的聚集在一个数组中,并动态地保持尽可能短的结果。这是问

  • 统计分析 点面互查 缓冲区分析 高级筛选