Probabilità carte

kobeilprofeta
Siamo in due, tu hai due carte io ne ho una. In tuttoci sono un re (K) e due jolly (J). A turno chi ha una carta ne pesca una dall'altro, vince chi arriva ad avere due jolly.
Se tocca a me a pescare qual è la probabilità che io vinca la partita (non per forza in questo turno)?

qui riporto il mio ragionamento:

Risposte
kobeilprofeta
PS) avvisatemi in caso non si leggano le formule nello spoiler

gygabyte017
Io farei così:


kobeilprofeta
@gygabyte

marco99991

xXStephXx
Volendo se $p$ è la probabilità che vince chi inizia, $p$ è data dalla probabilità che il primo pesca la carta giusta ($1/2$) più la probabilità che il primo pesca la carta sbagliata e il secondo trovandosi nella situazione di partenza non vince ($1/2(1-p)$).
ovvero $p=1/2+1/2(1-p)$ da cui $p=2/3$.

gygabyte017
Sono d'accordissimo con voi! Però ho provato a fare una simulazione numerica, che ritorna 1/2. Dove è sbagliata secondo voi?
    for (n = 1; n <= N; n++)
    {
        while (1)
        {
            r = (int)(rand()*1.0/RAND_MAX * 2.0);

            if (flg == 0 && r == 0){win++; break;} // A vince e conto una vittoria
            if (flg == 1 && r == 0){break;} // B vince e non conto vittoria

            flg = abs(flg-1);
        }
    }
printf("%d / %d = %lf\n",win,N,win*1.0/N);


$n$ cicla le iterazioni, e ad ogni iterazione flg rappresenta in che momento del gioco siamo: 0 se pesca il giocatore A, 1 se pesca il giocatore B; r rappresenta un numero random 0 o 1 che simula se il giocatore che gioca prende il J e vince (con prob 1/2). Quindi se flg=0 e esce r=0 (per esempio), vince A e si ricomincia il gioco; se flg = 1 e esce r=0, vince B e si ricomincia il gioco; se r = 1 si continua e si cambia il flg da 1 a 0 e viceversa.

Il risultato è $1/2$, cosa è sbagliato??
Ciao!

xXStephXx
flg = abs(flg-1);

Bella trovata! Ma bastava un bool xD

Comunque il problema sta nel fatto che flg non cambia se uno dei due giocatori vince. Quindi il giocatore che vince giocherà per primo la volta successiva. Invece deve essere sempre lo stesso il giocatore che comincia.

  for (int n = 1; n <= N; n++)
    {
        bool flg=0;
        while (1)
        {
            int r = (int)(rand()*1.0/RAND_MAX * 2.0);
            if (flg == 0 && r == 0){win++; break;} // A vince e conto una vittoria
            if (flg == 1 && r == 0){break;} // B vince e non conto vittoria
            flg = !flg;
        }
    }
printf("%d / %d = %lf\n",win,N,win*1.0/N);

marco99991
Di programmazione non so un beato nulla.
So soltanto che in questo gioco la logica è questa: il primo ha per sè il 50% di probabilità, il secondo il 50% di quello che resta, quindi 25%, il primo ancora il 12,5% e così via. Capisci anche tu che al primo turno di gioco il primo giocatore ha una probabilità di vittoria doppia rispetto al secondo, e così al secondo, al terzo...
è come se io mi prendessi la metà di una torta, tu la metà di ciò che resta, e così via...alla fine io avrò mangiato i 2/3, non di certo la metà...la logica è la stessa. Poi che il tuo programma non funzioni non ti so dire il perché.

xXStephXx
Comunque supponendo che chi ne vince una, poi comincia per primo a quella successiva, andava bene quel programma.
Infatti se $N$ è il numero medio di volte in cui vince il primo si ha
$N= 2/3N + 1/3(1-N)$ da cui $N=1/2$.

Infatti se il primo vince la prima partita, (coi $2/3$ delle possibilità), allora il numero medio di volte che vince rimane $N$, se invece il primo perde la prima (con $1/3$ delle possibilità), allora comincia il secondo e il numero medio di volte che vince il primo diventa $(1-N)$.

gygabyte017
"xXStephXx":
flg = abs(flg-1);

Bella trovata! Ma bastava un bool xD
Vero, pigrizia :D
"xXStephXx":

Comunque il problema sta nel fatto che flg non cambia se uno dei due giocatori vince. Quindi il giocatore che vince giocherà per primo la volta successiva. Invece deve essere sempre lo stesso il giocatore che comincia.

Esatto hai ragione non ci avevo fatto caso :oops: anche lui ora ritorna 2/3 :D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.