Come posso modellare i flip fino a N successi?


17

Decidiamo tu e io di giocare una partita in cui a turno lanciamo una moneta. Il primo giocatore che lancia 10 teste in totale vince la partita. Naturalmente, c'è una discussione su chi dovrebbe andare per primo.

Le simulazioni di questo gioco mostrano che il giocatore che lancia per primo vince il 6% in più rispetto al giocatore che lancia per secondo (il primo giocatore vince circa il 53% delle volte). Sono interessato a modellarlo analiticamente.

Questa non è una variabile casuale binomiale, in quanto non esiste un numero fisso di prove (capovolgi fino a quando qualcuno ottiene 10 teste). Come posso modellarlo? È la distribuzione binomiale negativa?


Per poter ricreare i miei risultati, ecco il mio codice 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 si lancia una moneta fino fallimenti e poi guardare la distribuzione del numero di successi che si verificano prima di terminare tale esperimento, allora questo è, per definizione, distribuzione binomiale negativa . r
Tim

2
Non riesco a riprodurre il valore del 2%. Trovo che il primo giocatore vinca delle volte. 53.290977425133892%
whuber

1
@whuber sì, credo che tu abbia ragione. Ho eseguito la simulazione meno volte di quanto avrei dovuto. I miei risultati sono commisurati ai tuoi.
Demetri Pananos,

1
Se uno vince il 53% delle volte, l'altro dovrebbe essere il 47%, quindi la descrizione non dovrebbe leggere "il primo giocatore vince il 6% in più rispetto al secondo giocatore" o "il 3% in più della metà del tempo"? Non (come dice attualmente) "3% in più rispetto al giocatore che lancia il secondo"
JesseM,

3
Hai ricevuto questa domanda dal FiveThirtyEight Riddler Express ?
foutandabout

Risposte:


19

La distribuzione del numero di code prima di raggiungere teste è negativa binomiale con parametri 10 e 1 / 2 . Sia f la funzione di probabilità e G la funzione di sopravvivenza: per ogni n 0 , f ( n ) è la possibilità del giocatore di n code prima di 10 teste e G ( n ) è la possibilità del giocatore di n o più code prima di 10 teste.10101/2fGn0f(n)n10G(n)n10

Poiché i giocatori rotolano in modo indipendente, la probabilità che il primo giocatore vinca tirando esattamente code si ottiene moltiplicando quella possibilità per la probabilità che il secondo giocatore tira n o più code, pari a f ( n ) G ( n ) .nnf(n)G(n)

Sommando tutte le possibili danno le possibilità di vincita del primo giocatore comen

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

Questo è circa il più della metà delle volte.3%

In generale, sostituendo con qualsiasi numero intero positivo m , la risposta può essere data in termini di una funzione ipergeometrica: è uguale a10m

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

Quando si utilizza una moneta distorta con una probabilità di teste, questo si generalizza ap

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

Ecco una Rsimulazione di un milione di tali giochi. Riporta una stima di . Un test di ipotesi binomiale per confrontarlo con il risultato teorico ha un punteggio Z di - 0,843 , che è una differenza 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
Proprio come una nota che potrebbe non essere ovvia a colpo d'occhio, le nostre risposte concordano numericamente: (.53290977425133892 - .5) * 2 è essenzialmente esattamente la probabilità che ho dato.
Dougal,

1
@Dougal Grazie per averlo sottolineato. Ho esaminato la tua risposta, ho visto il e sapendo che non era d'accordo con la forma della risposta richiesta nella domanda, non ho riconosciuto che tu l'hai calcolato correttamente. In generale è una buona idea inquadrare una risposta a qualsiasi domanda nel modulo che viene richiesto, se possibile: ciò rende facile riconoscere quando è corretto e facile confrontare le risposte. 6.6%
whuber

1
@whuber Stavo rispondendo alla frase "Le simulazioni di questo gioco mostrano che il giocatore che lancia per primo vince il 2% (MODIFICA: 3% in più dopo aver simulato più giochi) in più rispetto al giocatore che lancia il secondo". Interpreterei "vince il 2% in più" come ; il valore corretto è infatti del 6,6%. Non sono sicuro di un modo di interpretare "vince il 2% in più" significa "vince il 52% delle volte", anche se apparentemente è quello che era previsto. Pr(A wins)Pr(B wins)=2%
Dougal,

@Dougal Sono d'accordo sul fatto che la descrizione del PO sia confusa e persino sbagliata. Tuttavia, il codice e il suo risultato hanno chiarito che intendeva "3% in più della metà del tempo" anziché "3% in più rispetto all'altro giocatore".
whuber

1
@whuber Concordato. Sfortunatamente, ho risposto alla domanda prima della pubblicazione del codice e non ho eseguito una simulazione da solo. :)
Dougal,

15

Possiamo modellare il gioco in questo modo:

  • Il giocatore A lancia ripetutamente una moneta, ottenendo i risultati A1,A2, fino a quando non ottengono un totale di 10 teste. Lasciate che l'indice di tempo delle teste 10 ° sia la variabile casuale X .
  • Il giocatore B fa lo stesso. Lasciare l'indice temporale delle teste 10a la variabile casuale Y , che è una copia IID X .
  • Se XY , il giocatore A vince; altrimenti vince il giocatore B. Cioè,
    Pr(A wins)=Pr(XY)=Pr(X>Y)+Pr(X=Y)Pr(B wins)=Pr(Y>X)=Pr(X>Y).

Il divario nelle percentuali di vincita è quindi

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

Come sospettavi, X (e Y ) sono distribuiti essenzialmente in base a una distribuzione binomiale negativa. Notazioni per questo variano, ma nella parametrizzazione di Wikipedia , abbiamo le teste come un "fallimento" e le code come un "successo"; abbiamo bisogno di r=10 "fallimenti" (testine) prima che l'esperimento venga interrotto e probabilità di successo p=12 . Quindi il numero di "successi", che èX10, ha

Pr(X10=k)=(k+9k)210k,
e la probabilità di collisione è
Pr(X=Y)=k=0(k+9k)222k20,
che Mathematica ci dice utilmente è7649952511622614676.6%.

Pertanto, la percentuale di vincita del giocatore B è Pr(Y>X)46.7% e quella del giocatore A è 619380496116226146753.3%.


le teste non devono essere in fila, solo 10 in totale. Presumo che sia quello che stai risolvendo.
Demetri Pananos,

6
(+1) Mi piace questo approccio meglio di quello che ho pubblicato perché è più semplice dal punto di vista computazionale: richiede solo la funzione di probabilità, che ha una semplice espressione in termini di coefficienti binomiali.
whuber

1
Ho inviato una modifica sostituendo l'ultimo paragrafo mettendo in discussione la differenza rispetto all'altra risposta con una spiegazione di come i loro risultati siano effettivamente gli stessi.
Monty Harder,

1

Sia Eij l'evento che il giocatore lancia lanci i prima che l'altro giocatore lanci j teste e X sia i primi due lanci con spazio campione {hh,ht,th,tt} dove h significa testa e croce, e lascia 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)

Pr(X=)=1/4pij=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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.