2014-02-13 5 views
4

Я изучаю программирование на Python на edX, что является очень хорошим курсом, и я до сих пор полностью рекомендую. Только посмотрев разговор TED на Statistics, я подумал, что это отличный способ реализовать навыки питона, которые я выбрал в реальном мире. Парень привел пример о вероятности того, что он постоянно переворачивает монету и ищет две повторяющиеся последовательности, которые, как он объяснил, вы считали бы такой же вероятностью, что и утверждал, на самом деле этого не делают. Проще говоря, он утверждает, что голова Heads Tails Heads более вероятна, чем Heads Tails Tails, поскольку в конце первой последовательности вы уже являетесь одной третью, чтобы повторить последовательность снова, где в конце второй последовательности вам тогда нужно бросить еще одну головку, чтобы снова начать последовательность. Это имеет смысл, поэтому я попытался доказать это своей маленькой программой 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 

Так что я запустить программу много раз и изменил максимальное значение итерации выше и выше, пока не могу доказать свое утверждение, что в среднем последовательность НТНА должна произойти Evey 8 бросков и последовательность каждые 10 HTT, как мне кажется, я получаю средние сбалансированные результаты в любом случае. Итак, мой вопрос: где я ошибся в своей реализации проблемы?

+2

Я думаю, что требование парня является фиктивным, если только он не говорит, что у вас больше шансов получить HTH для небольшого количества бросков. Чтобы получить больше пробега от HTH, чем HTT, по его словам, вам также нужно будет получить больше вхождений HTHT, чем HTTH. Но если вы примените ту же логику, HTTH уже имеет начало последовательности в конце, тогда как вы должны начать все сначала с HTHT. –

+0

@MarkkuK. На самом деле, к тому времени, когда у вас есть HTHT, у вас уже есть первые две буквы следующего HTHT. Для HTTH у вас есть только первая буква. –

+0

@MattParker, это правда, я применял то, что сказал парень слишком узко. Тем не менее, статистика HTHT и 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 

Running, что подтвердит ожидаемые значения 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

Я думал, что это должно ... два тестовых прогона на 1 миллион возвращены около 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. Я не понимаю, что существует отдельный обмен для такого рода вещей. Думал, что я попробую здесь, потому что для меня это был питон. – Hoppo

+0

@ Хоппо действительно, 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^[длина цепочки] - единственной переменной является длина, а не содержимое.

Теда говорить вы описали звуки как описание игры Penney в: http://en.wikipedia.org/wiki/Penney%27s_game Но ключевая разница в том, что игра Penney описывает вероятность любой последовательности, возникающую FIRST (так данный игрок может выиграть) - не общие вхождения в целом - который ваш код находит. Также возможно, что динамик TED получил вторую последовательность назад (HHT, а не HTT.)

Код ниже проверяет статистическую аномалию в игре Penney. Обратите внимание, что он «ломается» или выходит из внутреннего цикла при обнаружении.

Он выводит: НТН: +1000000 332854 3 +3,00432021247 ННТ: +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` 

`

Смежные вопросы