Generazione ed uso di numeri pseudocasuali A.C. Neve – Numeri pseudocasuali 1 Nella maggior parte dei problemi di simulazione di sistemi reali è molto sentita l’esigenza di poter utilizzare variabili casuali aventi una ben determinata distribuzione statistica anche se, quasi sempre, la richiesta si riferisce a numeri casuali uniformemente distribuiti in un certo intervallo di valori. La simulazione di sistemi probabilistici può fornire risultati tanto più affidabili quanto maggiore è il numero di eventi con i quali si sollecita il sistema, è quindi evidente che simili problemi dovranno essere affrontati con l’aiuto di elaboratori elettronici i quali, per definizione, sono degli automi deterministici a stati finiti e quindi non idonei alla generazione di eventi casuali. Solo attraverso lo sviluppo di opportuni algoritmi è possibile generare numeri casuali che però non potranno mai essere effettivamente casuali e pertanto vengono detti pseudocasuali. Affinché questi algoritmi possano essere ritenuti validi dovranno soddisfare alcune specifiche caratteristiche: • • • • • • Uniforme distribuzione statistica in un certo intervallo di valori Indipendenza statistica Riproducibilità della sequenza di valori Non ripetitività su un prefissato periodo Alta velocità di generazione Minimo utilizzo dello spazio di memoria In questa sede, saranno volutamente trascurati i metodi di generazione analogica i quali, pur risultando effettivamente casuali, richiedono dell’hardware aggiuntivo e presentano alcuni tipi di inconvenienti come la non riproducibilità delle sequenze, instabilità e criticità del controllo. Il primo metodo storicamente noto per la generazione di numeri pseudocasuali è attribuito a Von Neuman ed è detto Metodi dei Quadrati Centrati (middle square), esso si sviluppa secondo le seguenti modalità: • • • • • si sceglie a caso un numero di n cifre (detto seme) se ne calcola il quadrato si aggiungono a sinistra eventuali zeri fino ad arrivare a 2n cifre si eliminano le prime n/2 cifre e le ultime n/2 cifre il numero ottenuto è pseudocasuale e viene usato per ottenere il successivo questo metodo presenta l’inconveniente che i numeri generati non hanno una uniforme distribuzione statistica e che il periodo risulta molto breve. Un metodo alternativo, derivato da quello di Von Neuman, è detto Metodo dei Prodotti Centrati. Questo metodo parte con il prodotto di due numeri di n cifre e la successiva estrazione delle n cifre centrali. Questo metodo è affetto dagli stessi problemi del precedente ma presenta una ciclicità più lunga. Operando con numeri a quattro cifre, la ciclicità non supera alcune migliaia ed è molto frequente la tendenza a convergere verso lo zero. A.C. Neve – Numeri pseudocasuali 2 METODI CONGRUENZIALI I metodi più utilizzati per la generazione di numeri pseudocasuali sono quelli congruenziali i quali utilizzano l’aritmetica modulare. Dati due numeri A e B l’operatore mod è così definito: A mod B = A – (INT(A/B))*B A mod B = A Modulo se B ≠ 0 se B = 0 In pratica è il resto della divisione intera Sono poi definite le seguenti operazioni: Addizione modulare Prodotto modulare Inversione (12 + 16) mod 17 = 11 (8*10) mod 17 = 12 2-1 = 9 (infatti (2*9) mod 17 = 1) Dati due numeri A e B, essi si dicono congruenti modulo M se la loro differenza risulta essere multipla intera del loro modulo. Congruenza Per es. 20 ed 8 sono congruenti modulo 4 Infatti: (20 mod 8) = 4 e poi 20 – 8 = 12 che è multiplo intero di 4 e si ha che 20 mod 4 = 8 mod 4 Analogamente 18 e 16 sono congruenti modulo 2. I metodi congruenziali, usati per la generazione di sequenze di numeri pseudocasuali, si basano su una relazione di congruenza esprimibile attraverso una relazione ricorsiva del tipo: X i +1 = ( A ⋅ X i + C ) mod M con Xi, A, C ed M interi arbitrari non negativi. Assegnato un valore Xo di innesco (diverso da zero), il modulo M e le costanti A e C, è possibile determinare tutti i successivi valori della sequenza che risulterà così riproducibile. Esiste sempre un valore h dell’indice i tale che Xh = Xo , si ha così la ripetizione della sequenza dopo un periodo h che dipende dai valori di A, C, M. Questo indice h esiste perchè i resti della divisione per M possono essere solo 0,1,2, ... M-1 pertanto, al massimo dopo M cicli verrà generato il valore iniziale. I metodi congruenziali più noti sono quelli di Lehmer (detto moltiplicativo) e di Rotemberg (detto misto). Esiste anche il metodo di Fibbonacci (detto additivo) che però utilizza una relazione di congruenza leggermente diversa da quella prima introdotta. Ci sono infine i metodi di MacLaren e Marsaglia che sfruttano un metodo composito dei primi due. A.C. Neve – Numeri pseudocasuali 3 METODO di LEHMER Questo metodo prevede per la costante C il valore nullo per cui la relazione di congruenza diventa: X i +1 = ( A ⋅ X i ) mod M I valori di A ed M dipendono generalmente dal tipo di elaboratore utilizzato. Solitamente si attribuisce ad M il valore 2n con n pari al grado di parallelismo dell’elaboratore usato. La costante A deve risultare prima rispetto ad M e diversa da 1 così da evitare la generazione di una sequenza di numeri uguali. Alcuni autori suggeriscono l’utilizzo della massima potenza dispari di 5 tale che A < 2n. Altri invece consigliano l’uso di un valore di A sufficientemente grande e tale che nella sua rappresentazione binaria non vi siano troppi zeri. Altri ancora, infine, propongono l’uso di un valore di A ricavato dalla relazione A = 1 + (2 + 8 ⋅ k ) con K = 1,2,3,4......., in modo che risulti congruente con 3 secondo il modulo 8. I numeri pseudocasuali che si ottengono risultano compresi nell’intervallo ]0÷M[. Per ottenere un generatore standard nell’intervallo ]0÷1[ sarà sufficiente dividere per M i valori ottenuti. Il generatore così ottenuto potrebbe sembrare caratterizzato da una distribuzione continua dei valori nell’intervallo ]0÷1[, in realtà è sempre discreto e con un passo di discretizzazione pari ad 1/M. Una volta realizzato il generatore di numeri pseudocasuali sarebbe necessario verificare se le sequenze ottenute soddisfano le specifiche richieste per mezzo di opportuni test la cui validità è comunque sempre relativa. É possibile dimostrare che nessuna classe finita di prove può garantire la pseudocasualità di una sequenza finita di numeri, si può infatti verificare che una sequenza di numeri, pur avendo superato un certo numero di test, non sia idonea per una specifica applicazione. Si può asserire quindi che: il fatto che una o più sequenze di numeri generati per mezzo di un algoritmo iterativo che soddisfi un certo insieme di test statistici è una condizione necessaria ma non sufficiente a garantire la pseudocasualità sella sequenza stessa. Esistono in bibliografia molti tipi di test, i più noti sono: il test di frequenza, il test di autocorrelazione, il test di autocovarianza, il test del chi-quadro oltre a quelli più elementari come i test della media, della varianza e del valor quadratico medio. Per questi ultimi test si ottengono i seguenti valori: Valori attesi Media Varianza Valor Quadratico Medio A.C. Neve – Numeri pseudocasuali 0.5000000 0.0833333 0.3333333 A = 75 M = 65536 0.4999999 0.0833323 0.3333231 A = 783 M = 65529 0.4653915 0.0833781 0.2999674 4 METODO di ROTEMBERG Questo metodo è detto misto in quanto utilizza la relazione di congruenza nella sua forma più completa: X i +1 = ( A ⋅ X i + C ) mod M Anche in questo caso i valori di A, C ed M dipendono dal tipo di elaboratore usato. Esiste un teorema il quale asserisce che: Una sequenza congruente lineare presenta un periodo pari ad M se e solo se: • C ed M sono primi tra loro • (A-1) è multiplo intero di P per ogni numero P che divide M • Se M è multiplo di 4, (A-1) è multiplo dello stesso valore Di solito si sceglie per M il valore 2n con n grado di parallelismo del computer usato. Per la costante A, la maggior parte degli autori suggerisce un valore fornito dalla relazione A = (2s + 1) con s ≥ 2 Questa scelta è molto conveniente se il software è scritto in assembly in quanto il tempo di esecuzione può essere ridotto realizzando il prodotto A∗Xi tramite uno schift a sinistra di s posizioni del registro contenente Xi e poi sommando 1. Per il valore della costante C l’importante è che sia prima rispetto ad M e dispari. Le sequenze di numeri pseudocasuali che si possono ottenere con il metodo di Rotemberg sono generalmente più lunghe di quelle ottenibili con il metodo di Lehmer. Per quel che riguarda il comportamento statistico, i due metodi possono ritenersi simili. Valori attesi Media Varianza Valor Quadratico Medio A.C. Neve – Numeri pseudocasuali 0.5000000 0.0833333 0.3333333 A = 129 C=1 M = 65536 0.4997787 0.0833130 0.3330918 A = 32773 C=3 M = 65536 0.4979933 0.0839504 0.3309477 5 METODO di FIBONACCI Questo metodo è un caso particolare dei metodi additivi utilizzati per cercare di rendere ancor più lunghe le sequenze generabili. L’idea di base consiste nel far dipendere il valore Xn+1 da entrambi i valori Xn ed Xn-1 invece che solo da Xn. In queste condizioni il periodo della sequenza può arrivare fin a M2. Il più semplice di questi metodi è quello di Fibonacci X i +1 = ( X i + X i −1 ) mod M che però non risulta statisticamente molto affidabile. Il metodo più generale ed un pò più efficiente è: X i +1 = ( X i + X i − k ) mod M Mitchell e Moore hanno messo a punto questa versione: X i +1 = ( X i −24 + X i −55 ) mod M con M pari e Xo, X1, ....X54 interi arbitrari non tutti pari. Le costanti 24 e 55 non sono scelte a caso ma sono valori che consentono un periodo teorico della sequenza pari a 255 – 1 (in realtà è inferiore). I valori 24 e 55 sono detti lags e la sequenza è nota come lagged Fibonacci (LFG) Una evoluzione di questo metodo è poi quello dei generatori LFG paralleli. Per quel che riguarda i metodi congruenziali, autorevoli riferimenti bibliografici consigliano: Knuth Goodman Miller Gordon Leormont Lewis M 231 231 - 1 231 231 A.C. Neve – Numeri pseudocasuali A Int(π*10 )=314159265 75 513 216 + 3 = 65539 8 C 453806254 0 0 0 6 GENERATORI STANDARD La maggior parte dei software applicativi e dei linguaggi di programmazione mettono a disposizione degli utenti delle funzioni per la generazione di numeri pseudocasuali con distribuzioni uniformi nell’intervallo 0÷1. Questi generatori vengono molto spesso considerati continui ma in realtà risultano discreti anche se con un passo di discretizzazione molto piccolo. Da quanto visto in precedenza, un generatore di numeri pseudocasuali genera numeri interi compresi nell’intervallo 1÷M, quindi discreto. Un generatore standard si ottiene dividendo per M tutti i numeri generati con i metodi prima esposti. Per M = 65536, i numeri generati saranno distanziati tra loro di un passo di discretizzazione pari a 1/M e cioè di 0.000015259 mentre per M=231 il passo risulterà di 4.656612 10-10, l’entità di quest’ultimo valore consente pertanto, con buona approssimazione, di considerare il generatore come se fosse continuo. Qualsiasi sequenza di numeri pseudocasuali può essere sempre generata partendo da un generatore standard di numeri pseudocasuali. Un generatore continuo di numeri pseudocasuali compresi nell’intervallo N1÷N2 si ottiene operando un semplice cambio di scala sui valori generati da un generatore standard: si moltiplica il numero compreso nell’intervallo 0÷1 per la differenza (N2 – N1) e si aggiunge poi N1. GENERATORI DISCRETI L’esempio classico è quello della simulazione del lancio di un solo dado che rappresenta il tipico esempio di generatore discreto equiprobabile (dado non truccato!). Si consideri un generatore standard di numeri pseudocasuali compresi nell’intervallo [0÷1[. Il numero generato dal lancio di un dado di otterrà dalla relazione: NDADO = INTERO(Ncasuale * 6) + 1 Infatti: moltiplicando per 6 il numero Ncasuale , il suo valore sarà compreso tra 0 e 5.999999 estraendone l’intero, il suo valore potrà essere 0, 1, 2, 3, 4, 5 sommando infine 1, il suo valore potrà essere 1, 2, 3, 4, 5, 6 cioè come un dado. Essendo questo generatore equiprobabile, ci si aspetta di ottenere una sequenza che contenga la stessa quantità di 1, 2, 3, 4, 5, e 6. Questa verifica può essere effettuata per mezzo dell’esame dell’istogramma di frequenza. Nella figura seguente si può osservare l’istogramma di frequenza della simulazione di 600 lanci di un dado. Il risultato non sembra molto soddisfacente in quanto solo il 4 si è verificato un numero di volte pari a quella atteso (100) mentre il 3 ed il 5 sono molto lontani. Un indice della qualità di questa sequenza può essere ottenuto calcolando il ripple del grafico: Ripple = (Max – Min)/Valore-atteso = (113 – 85)/100 % = 28% Come si vede il risultato è alquanto scadente poiché il campione usato è molto piccolo e di conseguenza la simulazione che si effettuerà non sarà attendibile. A.C. Neve – Numeri pseudocasuali 7 L’attendibilità della simulazione di un sistema probabilistico è notevolmente influenzata dalle caratteristiche del campione usato e dalla sua dimensione. In questo semplice esempio la stabilità dei risultati dipende essenzialmente dalla dimensione del campione usato. Ponendo N = 10.000 lanci si ottiene un ripple del 10% circa Ponendo N = 30.000 lanci si ottiene un ripple del 5% circa Ponendo N = 50.000 lanci si ottiene un ripple del 3% circa Ponendo N = 100.000 lanci si ottiene un ripple del 2% circa Ponendo N = 200.000 lanci si ottiene un ripple dell'1% circa Ponendo N = 1.000.000 lanci si ottiene un ripple dello 0.5 % circa Queste informazioni sono di estrema importanza per valutare l'attendibilità di una simulazione operata con questi tipi di sequenze numeriche. Simili considerazioni risultano valide per la simulazione del lancio di due dadi (provare). Un pò diversa è invece la realizzazione di generatori discreti con distribuzione non uniforme. Il metodo più usato è quello della probabilità cumulata con griglia di uscita. In pratica si utilizzano gli intervalli della probabilità cumulata come griglia per la selezione dell’evento da generare. Si consideri come esempio un generatore discreto di numeri interi compresi tre 1 e 9 avente la seguente distribuzione di probabilità: come si può notare la somma delle probabilità dei nove eventi è pari ad 1. A.C. Neve – Numeri pseudocasuali 8 Con questa distribuzione si costruisce la seguente griglia nella quale l’ampiezza di ogni intervallo è proporzionale alla probabilità dell’evento corrispondente: 0 0.20 1 0.35 2 0.45 3 0.49 0.51 4 5 0.55 6 0.65 7 0.80 8 1.0 9 Il funzionamento del metodo è il seguente: • per mezzo di un generatore standard equiprobabile si genera un numero compreso tra 0 ed 1 • si individua l’intervallo della griglia al quale appartiene il numero • si associa il valore della griglia di uscita appartenente all’intervallo per es. se il numero generato è pari a 0.245456, appartenendo all’intervallo 0.2÷0.35, il valore generato in uscita sarà il 2; se il numero generato è pari a 0.632908, appartenendo all’intervallo 0.55÷0.65, il valore generato in uscita sarà il 7. GENERATORI CONTINUI CON DISTRIBUZIONE NON UNIFORME Disponendo di un generatore standard (con distribuzione continua ed uniforme nell’intervallo 0÷1) di numeri pseudocasuali è possibile generare delle sequenze continue con qualsiasi distribuzione di probabilità per mezzo della trasformazione inversa. Si consideri una variabile casuale continua x avente funzione di densità di probabilità f(x). Di questa funzione si determina la corrispondente funzione di ripartizione F(x) x r = F ( x) = ∫ f ( x) ⋅ dx 0 (si rammenta che la funzione di ripartizione F(x) di una variabile aleatoria indica la probabilità che la variabile assuma un valore minore o uguale ad x) Si determina poi l’espressione analitica (se esiste) della funzione inversa cioè x = F-1(r). La determinazione del campione della variabile x si ottiene generando un valore di r compreso tra 0 ed 1 e sostituendolo nell’espressione della funzione di ripartizione inversa. GENERATORI CON DISTRIBUZIONE LINEARE Si consideri una distribuzione lineare con la seguente densità di probabilità: f(x) P 2 B-A A A.C. Neve – Numeri pseudocasuali x B x 9 Dovendo risultare l’area sottesa dalla curva uguale a 1, si ha che il valore massimo nel punto B sarà pari a: S = 1 = h ⋅ ( B − A) ⋅ 1 2 ⇒ h= 2 B− A y − y0 x − x0 L’equazione della retta congiungente i punti A e P = risulta essere: y1 − y 0 x1 − x 0 f ( x) = 2 ⋅ ( x − A) ( B − A) 2 La sua funzione di ripartizione è data da: x x 2 ⋅ ( x − A) x2 2⋅ A⋅ x ⋅ dx = − 2 2 ( B − A) ( B − A) 2 A ( B − A) F ( x) = ∫ f ( x) ⋅ dx = ∫ A x A = ( x − A) 2 =r ( B − A) 2 operando la trasformazione inversa della funzione di ripartizione si ottiene: x = A + ( B − A) ⋅ r usando per r un valore compreso nell’intervallo [0÷1] e generato per mezzo di un generatore standard, si ottiene per x un campione appartenente ad una distribuzione lineare. Nel caso di una distribuzione lineare con pendenza negativa si ha che: f ( x) = 2 ⋅ ( B − x) ( B − A) 2 ⇒ x = B − ( B − A) ⋅ r Nelle figure seguenti sono proposti i grafici delle distribuzioni di frequenza relativi alla simulazione di un generatore di numeri pseudocasuali con distribuzione lineare tra 10 e 100 rispettivamente per la generazione di 10.000 ed 1.000.000 di campioni. A.C. Neve – Numeri pseudocasuali 10 GENERATORI CON DISTRIBUZIONE ESPONENZIALE La generica rappresentazione di una distribuzione esponenziale decrescente è la seguente: f ( x) = λ ⋅ e − λ ⋅x ∞ con λ > 0 e ∫λ ⋅e −λ ⋅ x ⋅ dx = 1 0 f(x) λ x La rappresentazione così proposta garantisce l’unitarietà dell’area sottesa dalla curva. La relativa funzione di ripartizione risulta: x x 0 0 F ( x) = ∫ f ( x) ⋅ dx = ∫ λ ⋅ e −λ ⋅ x ⋅ dx = 1 − e −λ ⋅ x = r operando la trasformazione inversa della funzione di ripartizione si ha che: x=− 1 λ ⋅ ln(1 − r ) con r compreso nell’intervallo [0÷1[ con r estratto da una distribuzione uniforme per mezzo di un generatore standard. (λ rappresenta la frequenza media di interarrivo se x rappresenta il tempo e 1/λ è il tempo medio di interarrivo). Nelle figure seguenti sono proposti i grafici delle distribuzioni di frequenza relativi alla simulazione di un generatore di numeri pseudocasuali con distribuzione esponenziale con λ = 0.8 rispettivamente per la generazione di 10.000 ed 1.000.000 di campioni. A.C. Neve – Numeri pseudocasuali 11 GENERATORI CON DISTRIBUZIONE GAUSSIANA La generica rappresentazione di una distribuzione gaussiana è la seguente: f ( x) = 1 σ ⋅ 2π ⋅e − ( x−µ )2 2⋅σ 2 con µ = media e σ = deviazione standard si rammenta che, nell’intervallo µ ±3 σ ricadono il 99.7% dei campioni f(x) µ - 3σ µ µ + 3σ x In questo caso non esiste, in forma esplicita, la funzione F(x) di ripartizione per cui non è possibile far uso del metodo della trasformazione inversa. Una distribuzione gaussiana può essere sufficientemente approssimata dalla somma di un certo numero di campioni estratti da distribuzioni uniformi 0÷1 (generatori standard), il numero di questi generatori è compreso tra 10 e 24 ma generalmente si consiglia 12. La relazione matematica attraverso la quale è possibile ottenere una accettabile sequenza di numeri con distribuzione gaussiana con media µ e scarto σ è la seguente: x=µ+ σ N N ⋅ ∑ ri − 2 N / 12 i =1 con N = numero di generatori standard ed ri = generico campione di tali generatori. Per N = 12 la precedente relazione diventa: 12 x = µ + σ ⋅ ∑ ri − 6 i =1 Nelle figure seguenti sono proposti i grafici delle distribuzioni di frequenza relativi alla simulazione di un generatore di numeri pseudocasuali con distribuzione gaussiana con µ = 0 e σ = 1 rispettivamente per la generazione di 10.000 ed 1.000.000 di campioni. A.C. Neve – Numeri pseudocasuali 12 GENERATORI HARDWARE DIGITALI La generazione di numeri pseudo casuali si ottiene facendo uso di registri a scorrimento (shift register) retroazionati tali cioè da riportare in ingresso un segnale proveniente dalla combinazione dei bit di uscita. Un registro a scorrimento di M bit viene pilotato con un clock a frequenza fo. L’ingresso del registro a scorrimento viene pilotato dall’uscita di una porta ex-OR i cui ingressi sono collegati alle uscite del registro a scorrimento (N e M) una delle quali è sempre l’ultimo bit M. La lunghezza massima della sequenza di numeri così ottenibile è pari a 2M-1 poiché lo stato formato da tutti zero bloccherebbe la generazione dei numeri. Questo valore della lunghezza della sequenza può essere ottenuto solo con una opportuna scelta dei valori di N ed M. Una volta generata l’intera sequenza, questa tornerà a ripetersi in modo periodico. La tabella seguente descrive i valori di M ed N e le relative lunghezze delle sequenze ottenibili. M 4 5 6 7 9 10 11 15 20 25 31 35 39 N 3 3 5 6 5 7 9 14 17 22 28 33 35 Lunghezza 15 31 63 127 511 1023 2047 32767 1048575 33554431 2147483647 34359738367 549755813887 A.C. Neve – Numeri pseudocasuali 1 2 3 N M 13 Nel caso in cui si volessero utilizzare dei registri di dimensione multipla di 8 bit, si dovranno utilizzare più di due linee di retroazione come descritto dalla seguente tabella. M 8 16 24 N1 4 4 17 N2 5 13 22 N3 6 15 23 Lunghezza 255 65535 16777215 Nelle figure seguenti sono proposti i circuiti di due generatori di numeri pseudocasuali rispettivamente ad 8 e 16 bit. A.C. Neve – Numeri pseudocasuali 14 METODO DI MONTECARLO Il metodo di Montecarlo fu ideato da S. Ulam e J. Von Neumann (altre fonti lo attribuiscono ad E. Fermi) per lo studio di problemi troppo complessi per essere risolti analiticamente o troppo costosi per essere affrontati sperimentalmente. Questo metodo, basato sulla tecnica del campionamento casuale, fu usata dal naturalista Buffon per la determinazione del valore del π per mezzo della misura della posizione di un ago ripetutamente lanciato su un foglio quadrettato. Il metodo di Montecarlo consente il raggiungimento di attendibili risultati in situazioni anche molto complesse grazie alla legge dei grandi numeri per la quale un fenomeno statistico tende a fornire risultati deterministici se sollecitato con un numero molto elevato di eventi casuali. L’esecuzione delle simulazioni dovranno iniziare con un numero limitato di eventi che sarà poi man mano aumentato in modo da verificare la tendenza dei valori a stabilizzarsi nell’intorno dei risultati cercati. L’esempio classico dell’uso del metodo di Montecarlo è la misura del valore di π. Si consideri un quadrato di lato unitario contenente al suo interno un arco di cerchio di raggio unitario centrato nell’origine. Per mezzo di un generatore di numeri pseudocasuali compresi nell’intervallo [0,1] ed uniformemente distribuiti, verranno generate delle coppie Xn,Yn che rappresenteranno dei punti all’interno del quadrato. Tutti questi punti dovranno essere divisi in due gruppi: quelli appartenenti a tutto il quadrato e quelli appartenenti al settore circolare. Essendo il generatore equiprobabile, è ragionevole ipotizzare che il numero di punti presenti nelle due aree risulti proporzionale al valore delle aree stesse e cioè: Numero di punti interni al settore circolare Area del settore circolare π ⋅ r 2 / 4 π = = = Numero di punti interni al quadrato Area del quadrato 4 r2 da cui: π = 4 ⋅ N punti cerchio N totale di punti in quanto il numero di punti interni al quadrato corrisponde al numero totale di punti usati per la simulazione. Il conteggio dei punti interni al settore circolare si ottiene valutando, per ogni punto, la distanza del punto dall’origine e cioè se: A.C. Neve – Numeri pseudocasuali 15 Dn = X n2 + Yn2 ≤ 1 allora il punto appartiene al settore altrimenti al quadrato. I risultati ottenibili dalle simulazioni presentano degli errori con i seguenti ordini di grandezza: Numero totale di punti 100 1.000 10.000 100.000 1.000.000 Errore sul calcolo del π 6% 2% 0,5% 0,1% 0,04% Un altro classico esempio riguarda il calcolo dell’integrale definito. Si rammenta che, dal punto di vista geometrico, il valore di un integrale definito coincide con il valore dell’area sottesa dalla curva tra i due estremi di integrazione. Si consideri come esempio la funzione: f ( x) = 3x 2 + 2 x + 1 ed il relativo integrale definito: B 5 A 1 INTEGRALE = ∫ f ( x)dx = ∫ 3 x 2 + 2 x + 1 = 152 Anche in questo caso, per mezzo di un generatore di numeri pseudocasuali uniformemente distribuiti, verranno generate delle coppie Xn,Yn tali che: Xn sia compreso tra A e B Yn si compreso (in questo caso) tra 0 ed f(B) (in generale è necessario valutare, caso per caso, la dimensione verticale del rettangolo). A.C. Neve – Numeri pseudocasuali 16 Tutti questi punti dovranno essere divisi in due gruppi: quelli appartenenti a tutto al rettangolo e quelli appartenenti all’area sottesa dalla curva. Essendo il generatore equiprobabile, è ragionevole ipotizzare che il numero di punti presenti nelle due aree risulti proporzionale al valore delle aree stesse e cioè: B ∫A f ( x)dx Numero di punti nell' area sottesa dalla curva Area sottesa dalla curva = = Numero di punti interni al rettangolo Area del rettangolo ( B − A) ⋅ f ( B) da cui: B ∫ f ( x)dx = ( B − A) ⋅ f ( B) ⋅ A Numero di punti nell' area sottesa dalla curva Numero totale di punti Il conteggio dei punti appartenenti all’area sottesa dalla curva si ottiene confrontando il valore della funzione nel punto Xn con il valore di Yn e cioè: f ( Xn) ≤ Yn allora il punto appartiene all’area sottesa dalla curva. se I risultati ottenibili dalle simulazioni presentano degli errori con i seguenti ordini di grandezza: Numero totale di punti 100 1.000 10.000 100.000 1.000.000 Errore sul calcolo dell’integrale 10% 4% 2% 1,7% 1,3% Un ulteriore classico esempio è quello del lancio di due dadi. E’ ben noto che il funzionamento del sistema consiste nel lancio di due dadi e la successiva somma dei due singoli risultati. Le combinazioni dei possibili risultati possono essere schematizzate dalla seguente tabella: 1 2 3 4 5 6 1 2 3 4 5 6 7 2 3 4 5 6 7 8 3 4 5 6 7 8 9 4 5 6 7 8 9 10 5 6 7 8 9 10 11 6 7 8 9 10 11 12 Come si può notare, il 2 ed il 12 si possono ottenere solo con una singola combinazione (1+1) e (6+6) senza altre possibilità, mentre il 7 è ottenibile con diverse combinazioni (6+1, 5+2, 4+3, 3+4, 2+5, 1+6). E’ pertanto ragionevole ipotizzare che la probabilità di ottenere il 7 è superiore a quella di ottenere il 2 o il 12. In considerazione del fatto che il numero totale di eventi è 36, è possibile calcolare le probabilità teoriche dei singoli eventi. A.C. Neve – Numeri pseudocasuali 17 Valore 2 3 4 5 6 7 8 9 10 11 12 1/36 2/36 3/36 4/36 5/36 6/36 5/36 4/36 3/36 2/36 1/36 Probabilità 2.77% 5.55% 8.33% 11.11% 13.88% 16.66% 13.88% 11.11% 8.33% 5.55% 2.77% Prob. % La simulazione di questo sistema è abbastanza semplice: per mezzo di due generatori standard ([0÷1[ equiprobabile) si simulano i due dadi per mezzo della relazione: NDADI = NDADO1 + NDADO2 = (INTERO(N1casuale*6)+1) + (INTERO(N2casuale*6)+1) La distribuzione degli eventi risulterà triangolare con il massimo in corrispondenza del 7. I risultati ottenibili dalle simulazioni presentano dei valori della probabilità degli eventi caratterizzata dai seguenti ordini di grandezza: 2 3 4 5 6 7 8 9 10 11 12 Prob. con N=500 3.4 5.4 7.6 11.6 14 17.4 13.4 11.2 6.8 5.2 4.0 Prob. con N=1500 2.56 5.92 8.32 8.84 15.2 16.32 13.68 10.32 9.24 6.36 3.24 Prob. con N=10000 2.86 5.52 8.56 11.28 13.18 17.71 14.06 10.99 8.3 5.65 2.89 Prob. con N=50000 2.75 5.37 8.44 11.02 13.91 16.67 13.97 11.15 8.34 5.59 2.76 Prob. con N=1000000 2.79 5.58 8.29 11.14 13.87 16.60 13.89 11.16 8.30 5.54 2.78 Come si può notare, all’aumentare del numero di eventi il valore della probabilità si avvicina sempre di più a quella teorica e con una ripetibilità dei risultati sempre maggiore. A.C. Neve – Numeri pseudocasuali 18