2014-02-13 145 views
4

我一直在学习python编程edX这是一个非常好的课程,我至今可以完全推荐。刚刚看过一个关于Statistics的TED演讲,我认为这很棒,这是一种锻炼我在真实世界场景中获得的Python技能的简单方法。这个人举了一个例子,说明不断翻转一枚硬币的可能性,并寻找两个反复出现的序列,他解释说,你会认为他有相同的发生概率,他声称事实上没有。简单地说,他声称序列头尾巴头最有可能发生比头尾尾巴在第一个序列的末尾,你已经有三分之一的重复序列再次在第二个序列的结尾你必须抛弃另一头再次开始序列。这非常有意义,所以我着手试图用我在这里显示的小型python程序来证明它。使用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 

因此,我已多次运行程序,改变最大迭代值高,但似乎无法证明自己的说法,平均的HTH顺序应该发生埃维8次投掷和HTT序列每10个,因为看起来我平均得到平衡的结果。所以我的问题是我在执行这个问题的时候出了什么问题?

+2

我认为那家伙的主张是虚假的,除非他说你更有可能得到HTH少数的折磨。为了从HTH中获得更多的胜利,因为他说,你必须得到比HTTH更多的HTHT。但是如果你应用他的同样的逻辑,HTTH已经在序列的最后开始了,而你必须从HTHT开始重新开始。 –

+0

@MarkkuK。实际上,当你有HTHT的时候,你已经有了下一个HTHT的前两个字母。对于HTTH,你只有第一个字母。 –

+0

@MattParker,的确如此,我正在应用这个人说的太狭隘。不过,HTHT vs HTTH的统计数据也大致相同,至少在这里使用该方法。 –

回答

4

你的专家是正确的,你的,你说他说的代码是正确的,但他实际上说了别的。他说,当你开始掷硬币时,你应该预计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投掷的预期值。

+0

就是这样。我只是在视频中再次观看了该部分,现在可以看到我出错的地方。这是我对实际问题的解释。我应该做的是平均数直到序列出现,而不是平均投掷硬币总数。谢谢。 – Hoppo

0
import random 

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

myList.append(random.randint(0,1)) 
myList.append(random.randint(0,1)) 

for x in range (3, numberOfTosses + 3): 
    myList.append(random.randint(0,1)) 
    if myList[x-3:x] == [1,0,1]: 
     HTH += 1 
    elif myList[x-3:x] == [1,0,0]: 
     HTT += 1 

print (HTH, " ", HTT) 
+0

这给出了相同的结果吗? – M4rtini

+1

我认为它应该......两次100万的测试运行返回124917 HTH,124855 HTT。 HTH应该更频繁地发生的原因是HTHTH = 2的可能性,而没有这样的五次翻转的组合会产生两个HTT结果。 – EducateMe

0

至于你的代码,这在功能上等同:

import random 

HTH = 0 
HTT = 0 

numberOfTosses = 1000000 

myList = [random.randint(0,1) for x in range(numberOfTosses)] 

for i in range(len(myList)-2): 
    a,b,c= myList[i:i+3] 
    HTH += int(a==c==1 and b==0) 
    HTT += int(a==1 and b==c==0) 

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

至于为什么两个序列出现相同的次数,我的直觉是,他们应该。你可能想问stats.stackexchange.com

+0

这就是他在谈话中提出的观点。他声称每个人都有相同的预感,但他们是不正确的,因此我为什么试图证明它,似乎我们只是证明专家是正确的还是非常错误的! :0我会尝试在stats.stackexchange.com。我没有意识到这种事情有单独的交换。以为我会在这里尝试,因为它是与我相关的python。 – Hoppo

+0

@Hoppo的确,如果你有一个与你的*代码相关的问题,stackoverflow是最好的地方(对我来说这似乎很好)。请不要将您的代码发布到统计信息上,只要询问序列是否应该发生相同的次数 – goncalopp

0

我认为你的专家是错误的,或者你误解了他在说什么。我没有看到你的代码检测HTH和HTT序列有什么问题。

对于少量的卷,可以通过每个可能的结果,而不是使用随机数。

对于3卷来说,很容易推测有8种可能的结果,其中恰恰有一种是HTH,另一种是HTT。

4卷有16个可能的结果。其中2人将以HTH开始,2人将以HTT开始;同样2将以HTH结束,2将以HTT结束。

我修改了您的代码以检查所有组合并计算检测到序列的次数。在我测试的所有情况下,这两个数字是相等的。 http://ideone.com/YtixtV

from __future__ import division 
import random 

def every_combination(n): 
    bits = [2**i for i in range(n)] 
    for value in xrange(2**n): 
     yield [1 if value & bits[i] else 0 for i in range(n)] 

for n in range(3, 16): 
    HTH = 0 
    HTT = 0 
    numberOfTosses = 0 

    for myList in every_combination(n): 

     numberOfTosses += len(myList) 
     for i in range (len(myList) - 2): 

      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 'For number of rolls', n 
    print 'HTT :' ,numberOfTosses, HTT, numberOfTosses/HTT 
    print 'HTH :' ,numberOfTosses, HTH, numberOfTosses/HTH 
0

您的代码确认存在的任一字符串的概率等于当从长序列选择连续的3个样品。

实际上,对于任何给定的链,三个样本匹配的概率总是1/2^[链长] - 唯一的变量是长度,而不是内容。

的TED谈论你所描述听起来像Penney公司的游戏的描述:http://en.wikipedia.org/wiki/Penney%27s_game 但这里的一个关键区别是,彭尼的比赛描述任何一个序列首先发生的可能性(所以给定的玩家可以赢得) - 总总出现不 - 你的代码找到了。 TED演讲者也可能倒退第二个序列(HHT,而不是HTT)。)

以下代码测试(并确认)彭尼游戏中的统计异常。注意它在发现时会“中断”或退出内部循环。

它输出: HTH:1000000 332854 3 3.00432021247 HHT:1000000 667146 1 1.49892227488

import random 

HTH = 0 
HHT = 0 
myList = [] 
i = 0 

numberOfTests = 1000000 
maxTosses = 10000 

hthConditionMeant=0 
hhtConditionMeant=0 

while i < numberOfTests : 
    myList = [] 
    j = 0 
    while (j < maxTosses): 
     myList.append(random.randint(0,1)) 
     if myList[j-3:j] == [1,0,1]: 
       HTH += 1 
       break 
     elif myList[j-3:j] == [1,1,0]: 
       HHT += 1 
       break 
     j += 1 
    i += 1 


cyclesToSeeHTHprecise = numberOfTests/float(HTH) 
cyclesToSeeHHTprecise = numberOfTests/float(HHT) 

print 'HTH :' ,numberOfTests, HTH, numberOfTests/HTH, cyclesToSeeHTHprecise 
print 'HHT :' ,numberOfTests, HHT, numberOfTests/HHT, cyclesToSeeHHTprecise` 

`