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
© Copyright 2024 ExpyDoc