Lancio di due dadi - Sito Personale di Ettore Limoli

Lancio di due dadi
Simulazione con Excel
di Ettore Limoli
Lanciando simultaneamente due dadi si ottiene un punteggio compreso tra 2 e 12. Se compiliamo una
tabella dei casi possibili, ci viene facile calcolare la probabilità con cui si verifica ogni singolo evento.
1
2
3
4
5
6
1
2
3
4
5
6
2
3
4
5
6
7
3
4
5
6
7
8
4
5
6
7
8
9
5
6
7
8
9
10
6
7
8
9
10
11
7
8
9
10
11
12
Dette probabilità sono riportate nella tabella sottostante.
Punteggio Probabilità
2
1/36
3
2/36
4
3/36
5
4/36
6
5/36
7
6/36
8
5/36
9
4/36
10
3/36
11
2/36
12
1/36
Una stima della probabilità di questi eventi può essere ottenuta lanciando n volte i due dadi e registrando il
risultato ottenuto a ogni singolo lancio. Si otterrà così una tabella delle frequenze assolute f con cui si è
ottenuto ogni singolo punteggio. Le frequenze relative, ossia f/n, con n sufficientemente alto, ci daranno
una stima delle probabilità.
Il nostro scopo è di ottenere una simulazione al computer degli n lanci e ci serviremo del VBA di Excel per
effettuare la simulazione.
È da notare che il foglio elettronico, il VBA o un qualsiasi altro linguaggio di programmazione non sono in
grado di generare veri numeri casuali ma pseudocasuali, ottenuti, cioè, a partire da un generatore (seme)
che fornisce una determinata sequenza numerica. Quanto faremo non ha quindi il valore di una verifica
sperimentale ma solo quello di comprendere come è possibile servirsi di Excel e del VBA per effettuare
delle simulazioni in cui intervengono variabili aleatorie.
1
In VBA ci serviremo della funzione RND per generare un numero pseudocasuale e, poiché detto numero
non è intero, ci serviremo della funzione INT per trasformarlo in un intero. Così, per ottenere un numero
pseudocasuale compreso fra 1 e 6, l’istruzione sarà: Int((6 * Rnd) + 1).
Per evitare di ottenere sempre la stessa sequenza di numeri pseudocasuali, useremo l’istruzione
Randomize, in modo di variare il seme ad ogni nuova simulazione.
Tramite il menu INSERISCI creiamo un nuovo modulo all’interno del quale inseriremo la seguente routine.
Option Explicit
Public Sub lanci()
Dim n As Integer
Dim i As Integer
Dim p As Integer
Dim q As Integer
Dim v As Integer
Dim indirizzo As String
Dim F(2 To 12) As Integer
'numero di lanci
'contatore
'punteggio primo dado
'punteggio secondo dado
'punteggio complessivo
'indirizzo cella di output
'array delle frequenze
n = [A4]
'assegna ad n il valore della cella [A4]
For i = 2 To 12
F(i) = 0
Next i
'azzera le frequenze
Randomize
'inizializza il generatore di numeri casuali
For i = 1 To n
p = Int((6 * Rnd) + 1)
q = Int((6 * Rnd) + 1)
v=p+q
F(v) = F(v) + 1
Next i
'genera numero casuale tra 1 e 6 (primo dado)
'genera numero casuale tra 1 e 6 (secondo dado)
'punteggio complessivo
'aggiorna la frequenza
For i = 2 To 12
indirizzo = "B" + CStr(i + 5)
Range(indirizzo).Value = F(i)
Next
End Sub
'determina indirizzo di cella
'assegna il valore alla cella
L’istruzione Option Explicit costringe il programmatore a dichiarare tutte le variabili tramite le istruzioni
Dim. Questa è una buona regola di programmazione!
Come valore di n viene assunto il contenuto della cella [A4]. Prima di simulare gli n lanci si azzera l’array
delle frequenze F(i), facendo variare l’indice i da 2 a 12. Si simulano quindi gli n lanci. Ottenuto come
risultato di ogni singolo lancio un valore v (somma dei singoli punteggi p e q) si incrementa la frequenza
assoluta F(v) relativa a quel valore di v. Con l’ultimo ciclo vengono inseriti i valori direttamente nel foglio
calcolando prima l’indirizzo di cella (tramite la funzione CStr convertiamo l’intero in stringa) quindi il valore
di ogni singola cella dell’indirizzo ottenuta è posto uguale alla frequenza F(i) per ogni singolo i.
Ovviamente il foglio deve essere predisposto opportunamente in modo che il valore di n sia contenuto
nella cella [A4] e le frequenze assolute F() nel range [B7:B17].
Le frequenze relative verranno calcolate direttamente all’interno del foglio di calcolo e, per confrontare i
risultati con le probabilità teoriche, verrà disposta un’ultima colonna recante i valori di dette probabilità.
2
Il foglio di calcolo verrà, quindi, predisposto come segue:
Punteggio
2
3
4
5
6
7
8
9
10
11
12
Freq. Ass.
561
1149
1616
2228
2770
3342
2755
2218
1663
1155
543
Freq. Rel.
=B7/$A$4
=B8/$A$4
=B9/$A$4
=B10/$A$4
=B11/$A$4
=B12/$A$4
=B13/$A$4
=B14/$A$4
=B15/$A$4
=B16/$A$4
=B17/$A$4
Probabilità
=1/36
=2/36
=3/36
=4/36
=5/36
=6/36
=5/36
=4/36
=3/36
=2/36
=1/36
L’aspetto è il seguente:
Tramite il pulsante [Esegui] verrà richiamata la procedura lanci.
Dal menu SVILUPPO – INSERISCI si sceglierà il pulsante di controllo modulo che verrà inserito nella
posizione voluta. Cliccando col pulsante destro del mouse sul pulsante appena inserito, sarà possibile
assegnare il nome della macro associata che, nel nostro caso, è lanci.
Altrettanto semplice è modificare l’etichetta (per esempio “Esegui”).
È pure semplice aggiungere due diagrammi a barre. Il primo conterrà le frequenze assolute, il secondo le
frequenze relative a confronto con i valori delle probabilità teoriche.
L’aspetto complessivo del foglio è riportato nella figura sottostante. Non viene mostrato il pulsante [Esegui]
perché l’immagine è ottenuta come anteprima di stampa.
3
Un ultimo accorgimento.
Per evitare che, cambiando il valore di n nella cella [A4], il foglio non venga ricalcolato in modo automatico
ma occorra premere il pulsante [Esegui], aggiungiamo la seguente routine all’interno di Foglio 1 e non
Modulo 1 dove avevamo inserito lanci (vedi figura).
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = [A4] Then lanci
End Sub
L’evento Change applicato all’oggetto Worksheet, ci consente di individuare se il valore di una cella o di un
intervallo (range), passato in valore (ByVal) alla procedura come variabile Target (di tipo Range), è
modificato. Così, se ad essere modificata è la cella [A4], viene eseguita la procedura lanci.
Prof. Ettore Limoli
4