Attività successiva    Attività precedente    Home







Problema di carte #1



Quante carte di un mazzo di 52, in media, devo alzare per ottenere un asso?

Soluzione teorica

Qui la nozione che ci serve è quella di valor medio della variabile casuale X che indica il numero di carte da alzare per ottenere un asso. E' chiaro che nel caso peggiore dovrò alzare 49 carte (perché può succedere che alzi 48 carte diverse da un asso ma, in questo caso, la 49-esima è necessariamente un asso). Quindi la variabile casuale X può assumere i valori da 1 a 49 e tali valori hanno naturalmente probabilità diverse. Indichiamo con p(n) la probabilità che il primo asso si presenti avendo alzato n carte. Ad esempio, p(2) indica la probabilità che il primo asso si presenti alla seconda carta (di un mazzo ben mescolato, s'intende). Come calcolare p(n)? Osserva il diagramma ad albero qui a fianco, sui cui rami sono indicate le probabilità condizionate. Allora si ha

In generale, se n>1

(sappiamo inoltre che per n=1, p(n)=4/52). Come vedi, abbiamo usato il simbolo di produttoria; ad esempio il simbolo

indica il prodotto

Ora per determinare il valor medio E(X) della variabile casuale X dovremo calcolare l'espressione

Si tratta di un calcolo oneroso che volentieri deleghiamo a Derive. Vediamo, prima di tutto, come implementare la funzione p(n)

Tieni presente che il simbolo di produttoria lo trovi nella tavola dei simboli matematici di Derive oppure puoi usare il comando PRODUCT. Verifichiamo che la funzione p(n) definisce una corretta distribuzione di probabilità per la variabile casuale X (la somma dei valori p(n) con n che va da 1 a 49 deve essere 1)

Ed ecco il valor medio cercato

Dunque devo alzare in media 10,6 carte per ottenere un asso.

Tracciamo infine il grafico della distribuzione di probabilità p(n)







Simulazione con Derive

Il primo passo consiste nello scrivere un programma che generi un mazzo di 52 carte disposte casualmente. Ai nostri fini interessano solo due tipi di carte: gli assi, che indicheremo con A, e le altre carte, che indicheremo con B. L'algoritmo è questo:

  • generiamo un vettore v i cui elementi siano 52 stringhe "B";

  • generiamo un numero casuale j compreso tra 1 e 52 e sostituiamo nel vettore v l'elemento al posto j con la stringa "A";

  • ripetiamo l'operazione precedente fino a quando non avremo sostituito quattro "B" con quattro "A" (dovremo controllare prima di effettuare la sostituzione che al posto j non sia già presente una "A").

In tal modo otterremo una distribuzione certamente casuale dei quattro assi nel mazzo. Ecco il codice

Due osservazioni sul codice. Le variabili i, j e v che compaiono come argomenti del comando mazzo sono variabili di servizio che vengono definite all'interno del programma e non dovranno essere passate quando chiameremo il comando: chiameremo semplicemente mazzo(). E' importante tuttavia indicare tali variabili come argomenti perché così saranno a tutti gli effetti variabili locali, visibili solo all'interno del programma. Nota poi che all'interno del programma (costrutto Prog) viene riutilizzato il costrutto Prog per definire un sottoprogramma (un blocco di comandi, nel nostro caso di due comandi) che sarà eseguito se la condizione del comando If è verificata. Facciamo una prova

La riga #12 è ottenuta semplificando la #11, la #13 risemplificando la #11. Come vedi, sono generate due diverse sequenze casuali di carte.

Ecco ora il comando che simula n prove cioè che simula per n volte l'alzata di una carta fino a quando non si trova un asso. In uscita il comando fornisce un vettore i cui n elementi sono il numero di carte alzate in ciascuna prova. Fai attenzione, all'interno del programma, ogni volta che viene chiamato mazzo() sarà generata una nuova sequenza casuale di 52 carte.

Un breve commento al codice del comando simula. Il comando Position cerca la prima occorrenza della stringa "A" nel vettore mazzo() e fornisce in output la posizione della stringa (quindi, per noi, il numero di carte necessarie per ottenere il primo asso). Il valore numerico trovato viene aggiunto al vettore w che all'inizio è vuoto. E così via, per n volte (con mazzi ogni volta diversi). Alla fine del ciclo il comando simula mette in uscita il vettore w. Facciamo una prova

Semplificando il comando della riga #15 otteniamo il vettore dei risultati di 5 prove; ad esempio la terza prova ha dato per risultato 16, e quindi alla terza prova sono state alzate 16 carte per ottenere il primo asso.

Bene, è ora facile calcolare sperimentalmente il numero medio di carte da alzare per ottenere il primo asso; consideriamo la simulazione di 10000 prove

Come vedi, la sommatoria alla riga #18 ha una comoda sintassi: sono sommati tutti i valori i, con i che varia nel vettore fornito dal comando simula(n). Il risultato ottenuto semplificando la riga #18 conferma sperimentalmente il risultato teorico che avevamo determinato. Fai tu altri esperimenti: se n è sufficientemente grande, otterrai valori che oscillano attorno a 10,6.



Attività successiva    Attività precedente    Home



Ultimo aggiornamento gennaio 2007
Versione di Derive utilizzata 6.10
p.lazzarini@tin.it