Как я могу моделировать сальто до N успехов?


17

Мы с тобой решили сыграть в игру, в которой мы по очереди подбрасываем монету. Первый игрок, который перевернет 10 голов, выигрывает игру. Естественно, есть спор о том, кто должен идти первым.

Моделирование этой игры показывает, что игрок, который переворачивает первый, выигрывает на 6% больше, чем игрок, который переворачивает второй (первый игрок выигрывает примерно в 53% времени). Я заинтересован в моделировании этого аналитически.

Это не биноминальная случайная величина, так как не существует фиксированного количества испытаний (переворачивайте, пока кто-то не получит 10 голов). Как я могу смоделировать это? Это отрицательное биномиальное распределение?


Чтобы восстановить мои результаты, вот мой код на Python:

import numpy as np
from numba import jit


@jit
def sim(N):

    P1_wins = 0
    P2_wins = 0

    for i in range(N):

        P1_heads = 0
        P2_heads = 0
        while True:

            P1_heads += np.random.randint(0,2)

            if P1_heads == 10:
                P1_wins+=1
                break

            P2_heads+= np.random.randint(0,2)
            if P2_heads==10:
                P2_wins+=1
                break
    return P1_wins/N, P2_wins/N


a,b = sim(1000000)

3
Когда вы бросаете монету до неудач , а затем посмотреть на распределение числа успехов , которые происходят до окончания такого эксперимента, то это по определению отрицательного биномиального распределения . r
Тим

2
Я не могу воспроизвести значение 2%. Я считаю, что первый игрок выигрывает времени. 53.290977425133892%
whuber

1
@ Да, я верю, что ты прав. Я запускал симуляцию меньше раз, чем должен был. Мои результаты соизмеримы с вашими.
Димитрий Пананос

1
Если один из них выигрывает 53% времени, другой должен составлять 47%, то не должно ли описание гласить: «первый игрок выигрывает на 6% больше, чем второй игрок» или «3% больше, чем наполовину»? Нет (как сейчас говорят) «на 3% больше, чем у игрока, который переворачивает второе»
JesseM

3
Вы получили этот вопрос от FiveThirtyEight Riddler Express ?
foutandabout

Ответы:


19

Распределение числа хвостов до достижения головок является отрицательным биномиальным с параметрами 10 и 1 / 2 . Пусть F есть функция вероятности и G функция выживания: для каждого п 0 , ф ( п ) есть шанс игрока из п хвостов перед тем10101/2fGn0f(n)n голов и G ( п ) есть шанс игрока из русских или более хвостовпрежде чем 10 голов.10G(n)n10

Поскольку игроки бросают независимо, шанс того, что первый игрок выиграет с броском ровно n хвостов, получается умножением этого шанса на шанс того, что второй игрок бросит или более хвостов, равный f ( n ) G ( n ) .nf(n)G(n)

Суммирование по всем возможным дает шансы на победу первого игрока какn

n=0f(n)G(n)53.290977425133892%.

Это примерно на больше, чем в половине случаев.3%

В общем случае, заменяя на любое положительное целое число m , ответ можно дать в терминах гипергеометрической функции: он равен10m

1/2+22m12F1(m,m,1,1/4).

При использовании смещенной монеты с вероятностью голов, это обобщаетp

12+12(p2m)2F1(m,m,1,(1p)2).

Вот Rсимуляция миллиона таких игр. Он сообщает, что оценка 0.5325 . Тест биномиальной гипотезы сравнить его с теоретическим результатом имеет Z-балл , что является незначительным различием.0.843

n.sim <- 1e6
set.seed(17)
xy <- matrix(rnbinom(2*n.sim, 10, 1/2), nrow=2)
p <- mean(xy[1,] <= xy[2,])
cat("Estimate:", signif(p, 4), 
    "Z-score:", signif((p - 0.532909774) / sqrt(p*(1-p)) * sqrt(n.sim), 3))

1
Так же, как примечание, которое может быть неочевидным с первого взгляда, наши ответы согласуются численно: (.53290977425133892 - .5) * 2, по сути, именно та вероятность, которую я дал.
Дугал

1
@ Дугал Спасибо, что указал на это. Я посмотрел на ваш ответ, увидел и, зная, что он не соответствует форме ответа, запрошенного в вопросе, я не понял, что вы правильно рассчитали. В целом, желательно по возможности сформулировать ответ на любой вопрос в запрашиваемой форме: это позволяет легко распознать правильность и сравнить ответы. 6.6%
whuber

1
@whuber Я отвечал на фразу «Симуляторы этой игры показывают, что игрок, который переворачивает игру первым, выигрывает на 2% (РЕДАКТИРОВАТЬ: на 3% больше после симуляции большего количества игр) больше, чем игрок, который переворачивает второе» Я бы интерпретировал «выигрывает на 2% больше» как ; правильное значение действительно 6,6%. Я не уверен в способе интерпретации «выигрывает на 2% больше» означает «выигрывает в 52% случаев», хотя, очевидно, именно это и было задумано. Pr(A wins)Pr(B wins)=2%
Дугал

@ Дугал Я согласен, что описание ОП сбивает с толку и даже ошибочно. Тем не менее, код и его результат дали понять, что он имел в виду «на 3% больше, чем половина времени», а не «на 3% больше, чем у другого игрока».
whuber

1
@whuber Согласен. К сожалению, я ответил на вопрос до того, как код был опубликован, и сам не запускал симуляцию. :)
Дугал

15

Мы можем смоделировать игру так:

  • Игрок A многократно подбрасывает монету, получая результаты A1,A2, пока они не получат в общей сложности 10 голов. Пусть временной индекс 10-й головы будет случайной величинойX .
  • Игрок Б делает то же самое. Пусть индекс времени 10-й головы будет случайной величиной Y , которая является iid-копиейX .
  • Если XY , игрок A побеждает; в противном случае игрок B выигрывает. То есть
    Pr(A wins)=Pr(XY)=Pr(X>Y)+Pr(X=Y)Pr(B wins)=Pr(Y>X)=Pr(X>Y).

Разрыв в показателях выигрыша, таким образом ,

Pr(X=Y)=kPr(X=k,Y=k)=kPr(X=k)2.

Как вы подозревали, XY ) распределены по существу в соответствии с отрицательным биномиальным распределением. Обозначения для этого различаются, но в параметризации Википедии мы имеем головы как «провал» и хвосты как «успех»; нам нужно r=10 «неудач» (голов) до того, как эксперимент будет остановлен, а вероятность успеха p=12 . Тогда число «успехов», которое составляетX10, имеет

Pr(X10=k)=(k+9k)210k,
и вероятность столкновения равна
Pr(X=Y)=k=0(k+9k)222k20,
что Mathematica сообщает нам,7649952511622614676.6%.

Таким образом, выигрыш игрока B составляет Pr(Y>X)46.7% , а игрока A - 619380496116226146753.3%.


головы не должны быть в ряд, всего 10. Я предполагаю, что это то, что вы исправляете.
Димитрий Пананос

6
(+1) Мне нравится этот подход лучше, чем тот, который я опубликовал, потому что он вычислительно проще: он требует только функции вероятности, которая имеет простое выражение в терминах биномиальных коэффициентов.
whuber

1
Я представил правку, заменяющую последний абзац, в котором ставится под сомнение отличие от другого ответа объяснением того, как их результаты на самом деле совпадают.
Монти Хардер

1

Пусть Eij будет событием, когда игрок при броске переворачивает мои головы до того, как другой игрок перевернет j голов, и пусть X будет первыми двумя переворотами, имеющими пробное пространство {hh,ht,th,tt} где h означает головы и т хвосты, и пусть pijPr(Eij) .

Тогда pij=Pr(Ei1j1|X=hh)Pr(X=hh)+Pr(Ei1j|X=ht)Pr(X=ht)+Pr(Eij1|X=th)Pr(X=th)+Pr(Eij|X=tt)Pr(X=tt)

Assuming a standard coin Pr(X=)=1/4 means that pij=1/4[pi1j1+pi1j+pij1+pij]

solving for pij, =1/3[pi1j1+pi1j+pij1]

But p0j=p00=1 and pi0=0, implying that the recursion fully terminates. However, a direct naive recursive implementation will yield poor performance because the branches intersect.

An efficient implementation will have complexity O(ij) and memory complexity O(min(i,j)). Here's a simple fold implemented in Haskell:

Prelude> let p i j = last. head. drop j $ iterate ((1:).(f 1)) start where
  start = 1 : replicate i 0;
  f c v = case v of (a:[]) -> [];
                    (a:b:rest) -> sum : f sum (b:rest) where
                     sum = (a+b+c)/3 
Prelude> p 0 0
1.0
Prelude> p 1 0
0.0
Prelude> p 10 10
0.5329097742513388
Prelude> 

UPDATE: Someone in the comments above asked whether one was suppose to roll 10 heads in a row or not. So let Ekl be the event that the player on roll flips i heads in a row before the other player flips i heads in a row, given that they already flipped k and l consecutive heads respectively.

Proceeding as before above, but this time conditioning on the first flip only, pk,l=11/2[pl,k+1+pl,0] where pil=pii=1,pki=0

This is a linear system with i2 unknowns and one unique solution.

To convert it into an iterative scheme, simply add an iterate number n and a sensitivity factor ϵ:

pk,l,n+1=1/(1+ϵ)[ϵpk,l,n+11/2(pl,k+1,n+pl,0,n)]

Choose ϵ and pk,l,0 wisely and run the iteration for a few steps and monitor the correction term.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.