Como posso modelar flips até N ter sucesso?


17

Você e eu decidimos jogar um jogo em que revezamos o lançamento de uma moeda. O primeiro jogador a virar 10 cabeças no total ganha o jogo. Naturalmente, há uma discussão sobre quem deve ir primeiro.

Simulações deste jogo mostram que o jogador que vira primeiro ganha 6% a mais do que o jogador que vira o segundo (o primeiro jogador vence aproximadamente 53% do tempo). Estou interessado em modelar isso analiticamente.

Esta não é uma variável aleatória binomial, pois não há um número fixo de tentativas (vire até que alguém ganhe 10 cabeças). Como posso modelar isso? É a distribuição binomial negativa?


Para poder recriar meus resultados, aqui está o meu código 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
Quando você joga uma moeda até falhas e, em seguida, observa a distribuição do número de sucessos que acontecem antes de terminar esse experimento, essa é, por definição, uma distribuição binomial negativa . r
Tim

2
Não consigo reproduzir o valor de 2%. Acho que o primeiro jogador ganha do tempo. 53.290977425133892...%
whuber

1
@ whuber sim, acredito que você está certo. Executei minha simulação menos vezes do que deveria. Meus resultados são proporcionais aos seus.
Demetri Pananos

1
Se um vence 53% das vezes, o outro deve ser 47%, então a descrição não deveria ser lida como "o primeiro jogador ganha 6% a mais que o segundo jogador" ou "3% mais que a metade do tempo"? Não (como atualmente diz) "3% a mais do que o jogador que vira o segundo"
JesseM

3
Você recebeu esta pergunta do FiveThirtyEight Riddler Express ?
foutandabout

Respostas:


19

A distribuição do número de caudas antes de atingir cabeças é negativo binomial com parâmetros 10 e 1 / 2 . Let f10101/2f a função de probabilidade e a função de sobrevivência: para cada n 0 , f ( n ) é a chance de n caudas antes de 10 cabeças e G ( n ) é a chance de n ou mais caudas antes de 10 cabeças.Gn0 0f(n)n10G(n)n10

Como os jogadores rolam independentemente, a chance do primeiro jogador vencer rolando exatamente caudas é obtida multiplicando essa chance pela chance de o segundo jogador rolar n ou mais caudas, igual a f ( n ) G ( n ) .nnf(n)G(n)

A soma de todos os possíveis fornece as chances de vitória do primeiro jogador comon

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

Isso é cerca de mais da metade do tempo.3%

Em geral, substituindo por qualquer número inteiro positivo m , a resposta pode ser dada em termos de uma função hipergeométrica: é igual a10m

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

Ao usar uma moeda tendenciosa com uma chance de cabeças, isso generaliza parap

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

Aqui está uma Rsimulação de um milhão desses jogos. Ele relata uma estimativa de . Um teste de hipótese binomial para compará-lo com o resultado teórico tem um escore Z de - 0,843 , que é uma diferença insignificante.0.53250.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
Assim como uma observação que pode não ser óbvia à primeira vista, nossas respostas concordam numericamente: (.53290977425133892 - .5) * 2 é essencialmente exatamente a probabilidade que eu dei.
Dougal

1
@Dougal Obrigado por apontar isso. Eu olhei para a sua resposta, vi os e, sabendo que ela não estava de acordo com a forma da resposta solicitada na pergunta, não reconheci que você tinha calculado corretamente. Em geral, é uma boa ideia enquadrar uma resposta para qualquer pergunta no formulário solicitado, se possível: isso facilita o reconhecimento de quando é correto e fácil comparar as respostas. 6.6%
whuber

1
@whuber Eu estava respondendo à frase "Simulações deste jogo mostram que o jogador que vira primeiro ganha 2% (EDIT: 3% a mais depois de simular mais jogos) mais do que o jogador que vira o segundo". Eu interpretaria "ganha 2% a mais" como Pr(A wins)Pr(B wins)=2% ; o valor correto é de fato 6,6%. Não tenho certeza de que uma maneira de interpretar "ganha 2% a mais" significa "ganha 52% do tempo", embora aparentemente seja isso o que se pretendia.
Dougal 20/01

@ Dougal Concordo que a descrição do OP é confusa e até errada. No entanto, o código e seu resultado deixaram claro que ele queria dizer "3% a mais da metade do tempo" em vez de "3% a mais que o outro jogador".
whuber

1
@whuber concordou. Infelizmente, respondi à pergunta antes do código ser publicado e não fiz uma simulação. :)
Dougal

15

Podemos modelar o jogo assim:

  • O jogador A joga uma moeda repetidamente, obtendo os resultados A1,A2, até que eles tenham um total de 10 cabeças. Deixe o índice de tempo do 10.º cabeças ser a variável aleatória X .
  • O jogador B faz o mesmo. Deixe o índice de tempo dos 10o cabeças ser a variável aleatória Y , que é uma cópia de iid X .
  • Se XY , o jogador A vence; caso contrário, o jogador B vence. Ou seja,
    Pr(A wins)=Pr(XY)=Pr(X>Y)+Pr(X=Y)Pr(B wins)=Pr(Y>X)=Pr(X>Y).

A diferença nas taxas de ganho é, assim,

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

Como você suspeitava, X (e Y ) são distribuídos essencialmente de acordo com uma distribuição binomial negativa. As notações para isso variam, mas na parametrização da Wikipedia , temos cabeças como "falha" e coroas como "sucesso"; precisamos de r=10 "falhas" (cabeças) antes que o experimento seja interrompido e a probabilidade de sucesso p=12 . Então o número de "sucessos", que éX10, tem

Pr(X10=k)=(k+9k)210k,
e a probabilidade de colisão é
Pr(X=Y)=k=0(k+9k)222k20,
que o Mathematica nos diz útil é7649952511622614676.6%.

Assim, a taxa de vitória do jogador B é Pr(Y>X)46.7% e a do jogador A é 619380496116226146753.3%.


as cabeças não precisam estar seguidas, apenas 10 no total. Presumo que é isso que você está consertando.
Demetri Pananos

6
(+1) Gosto mais dessa abordagem do que a que postei porque é computacionalmente mais simples: requer apenas a função de probabilidade, que possui uma expressão simples em termos de coeficientes binomiais.
whuber

1
Enviei uma edição substituindo o último parágrafo questionando a diferença da outra resposta com uma explicação de como os resultados são realmente os mesmos.
Monty Mais difícil

1

EijX{hh,ht,th,tt}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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.