Sei sulla pagina 1di 21

Generazione di numeri casuali

Abbiamo già accennato all’idea che le tecniche


statistiche possano essere utili per risolvere problemi di
simulazione di processi fisici e di calcoli numerici.
Dobbiamo però imparare a generare variabili aleatorie
che seguano distribuzioni di probabilità note, e per
questo ci servono sequenze di numeri casuali.
Generare buone sequenze di numeri realmente casuali è
cosa complicata, per cui la migliore strategia consiste
nell’affidarsi a processi fisici intrinsecamente aleatori:
• decadimenti radioattivi
• rumore termico
• sistemi turbolenti (come ad esempio il cesto delle
palline del lotto)
Inutile dire che questi dispositivi non sono esattamente
portatili.

Laboratorio di Calcolo B 67
Generazione di numeri pseudo-
casuali
Siccome la generazione di numeri casuali è un po'
scomoda, ci si accontenta di sequenze pseudo-casuali.
Si tratta di fatto di sequenze perfettamente
deterministiche, che tuttavia generano numeri interi
uniformemente distribuiti in un dato intervallo, con
periodo di ripetizione molto lungo e con basso livello di
correlazione tra un elemento della sequenza e quello
successivo.
Esempio (Middle Square, Von Neumann, 1946):
Dato un numero intero di 10 cifre (seme della
sequenza) lo si eleva al quadrato e si prendono le 10
cifre centrali come numero successivo.
44231778342 = 19564502151188931556
Provate per esercizio a implementare questo metodo.

Laboratorio di Calcolo B 68
Uso della funzione random()
In ambiente C esiste un generatore di numeri casuali
uniformemente distribuiti. La funzione si chiama
long int random()
ed è definita in stdlib.h. Ogni chiamata a random()
ritorna un intero compreso tra 0 e RAND_MAX (che, nelle
macchine a 32 bits vale di solito 231-1). Se si vogliono
numeri compresi tra 0 e 1 si usa:
double rnd;
rnd = (double)random()/RAND_MAX;
Esiste anche una funzione
void srandom(long int)
che consente di definire il seme della sequenza (seme
uguale sequenza uguale, la qual cosa è particolarmente
utile in fase di debug). Se si vuole una sequenza
differente ad ogni esecuzione del programma si può
usare srandom(time());
Laboratorio di Calcolo B 69
La distribuzione binomiale
Una interessante applicazione delle distribuzioni
uniformi è la distribuzione binomiale. Consideriamo un
evento che consista nella ripetizione di n prove
indipendenti. L’esito di ogni prova i è caratterizzato da
una variabile aleatoria xi discreta che assume il valore 0
con probabilità p e il valore 1 con probabilità q=1-p. Si
dimostra (Lab1B) che la variabile somma delle xi assume
il valore k con probabilità

n k n −k
p ( k , n, p ) =   p (1 − p )
k 
Media e varainza della distribuzione binomiale sono
date da:
k = np σ 2 = np(1 − p )
Laboratorio di Calcolo B 70
La distribuzione binomiale
La binomiale risponde a
domande del tipo: se lancio n
volte una moneta, qual’è la
probabilità di ottenere testa k
volte? Altra visualizzazione
della binomiale è il tavolo
binario. Si tratta di un piano
inclinato con una serie di
chiodi piantati in modo da
formare un reticolo regolare.
Una biglia, urtando un chiodo,
può passare a destra o a
sinistra con uguale probabilità 0 1 2 3
(p = 0.5). Il numero di righe di
n=3
chiodi fornisce il numero di
ripetizioni n; la posizione di p=0.5
arrivo della biglia è k. k=2
Laboratorio di Calcolo B 71
Simulazione della binomiale
In laboratorio dovrete simulare un processo binomiale
e confrontarlo con la distribuzione teorica.
Si eseguono n estrazioni di numeri casuali compresi
tra 0 e 1. Se il numero estratto è maggiore di p si
somma 1, altrimenti 0. Il valore ottenuto, che sarà
compreso tra 0 e n, si inserisce in un istogramma a n+1
bins, e si ripete la procedura M volte (n,p e M devono
poter essere facilmente variati). Alla fine, se M è
abbastanza grande, l’istogramma approssimerà con
buona precisione una binomiale. Si deve eseguire un
fit per verificare che i valori di n e p ottenuti dal
confronto con la binomiale teorica coincidano, entro
gli errori, con quelli usati per la simulazione.
Siccome per n grande la binomiale tende alla
gaussiana, si può verificare questo fatto usando una
gaussiana per eseguire il fit.

Laboratorio di Calcolo B 72
Simulazione della binomiale:
matriale occorrente
int binEvent(int p, int n);
simula n ripetizioni di eventi binari con
probabilità p e ritorna il numero di successi k
double binomiale(int p, int n, int k);
calcola la probabilità binomiale
int/double binCoeff(int n, int k);
calcola il coefficiente binomiale; qui si deve
fare attenzione al modo in cui il calcolo viene
eseguito, perché altrimenti si perde
facilmente precisione o si eccedono i limiti
delle variabili intere.

Laboratorio di Calcolo B 73
Generazione di una gaussiana I
Un metodo per generare una distribuzione gaussiana
consiste nell’affidarsi al teorema del limite centrale:
“La distribuzione della somma di N variabili aleatorie
comunque distribuite tende, per N -> ∞, ad una
distribuzione gaussiana.”
Se sommiamo 12 variabili uniformemente distribuite in
[-0.5, 0.5], ricordando che

1/ 2
x= ∫ xdx = 0
−1 / 2
1/ 2
1
σ = ∫ x − x =
2 2
( )
−1 / 2
12

otteniamo (approssimativamente) una gaussiana con


media 0 e varianza 1. Se servono medie o varianze
diverse basta calcolare x’ = σx + <x>.
Laboratorio di Calcolo B 74
Traccia per l’esperienza
• Provare il generatore di numeri casuali
uniformemente distribuiti realizzando un
istrogramma (che deve risultare piatto). Provate a
variare il numero di eventi nell’istogramma.
• Simulare un processo binario e confrontare (tramite
best-fit) il risultato della simulazione con la
distribuzione binomiale teorica. Provate diversi valori
di n e p.
• Generare una distribuzione gaussiana utilizzando il
teorema del limite centrale; verificare tramite fit il
risultato ottenuto e ricavare i valori di media e
varianza. Provate a cambiare il numero di variabili
sommate.

Laboratorio di Calcolo B 75
Calcolo di integrali
Supponiamo di dover calcolare l’integrale di una
funzione in un intervallo limitato [xmin,xmax], e di
conoscere il massimo ed il minimo della funzione in tale
intervallo. Se generiamo n punti uniformemente
distribuiti nel rettangolo [xmin,xmax]x[fmin,fmax] avremo
che la frazione p di punti che cadono sotto la funzione
è pari al rapporto tra l’integrale e l’area del rettangolo
A. La distribuzione di successi è binomiale e si ha:

xmax

I= ∫ f ( x)dx = Ap
xmin

p(1 − p )
σ (I ) = A
n

Laboratorio di Calcolo B 76
Calcolo di π
Se in particolare si
sceglie come funzione
l’equazione del cerchio
nell’intervallo [0,1]x[0,1]
si può determinare il
valore di π.
Questa è stata la prima
applicazione del metodo
di montecarlo (Buffon
1777).
π
1
I =∫ 1 − x dx =
2

0
4
Laboratorio di Calcolo B 77
Generazione di distribuzioni di
probabilità arbitrarie
Abbiamo visto come generare eventi con
distribuzione di probabilità uniforme, ed
abbiamo anche visto in quale contesto tali
eventi sono utili.
Tuttavia la maggior parte dei problemi di
statistica applicati alla fisica richiedono
eventi con distribuzioni di probabilità non
uniformi.
È quindi importante imparare a generare
eventi distribuiti secondo una generica
densità di probabilità a partire da eventi
distribuiti uniformemente.

Laboratorio di Calcolo B 78
Il metodo della reiezione
Supponiamo che la distribuzione da generare, f(x), sia
definita nell’intervallo [xmin, xmax] e sia, in tale
intervallo, compresa tra 0 e fmax. Se estraiamo un
valore di x uniformemente in [xmin, xmax] potremo
decidere se accettarlo o meno sulla base di una
seconda estrazione uniforme y in [0, fmax] : se y è
minore di f(x) accettiamo il valore di x, altrimenti lo
rigettiamo. Questo metodo genera, per costruzione, la
distribuzione di probabilita desiderata. Il metodo è
quello usato per il calcolo dell’integrale.

Laboratorio di Calcolo B 79
Limiti del metodo di reiezione
Il metodo di reiezione non può trattare distribuzioni
di probabilità in intervalli non limitati.
Inoltre il metodo risulta molto inefficiente nel caso
si manipolino distribuzioni con picchi stretti (in
questo caso ci sono molte reiezioni...).
Nel caso della gaussiana questo metodo non è
applicabile.
Il fatto che modulando una distribuzione uniforme
con il valore della densità di probabilità si ottenga
l’integrale di tale distribuzione ci suggerisce che
possa esistere un legame funzionale tra l’integrale di
una densità di probabilità ed una variabile aleatoria
distribuita uniformemente. Questa idea è alla base
del metodo di inversione.
Laboratorio di Calcolo B 80
Il metodo di inversione
Data la solita f(x), definita in [xmin, xmax],
cerchiamo una funzione g tale che, se η è una
variabile aleatoria distribuita uniformemente
in [0,1], allora g(η) è distribuita secondo f in
[xmin, xmax]. Potremo porre:
• g(0) = xmin
• g(1) = xmax
• p(η)dη = dη = f(x)dx

0 1 η xmin xmax x
Laboratorio di Calcolo B 81
Il metodo di inversione
Cominciamo ad affrontare il problema inverso, ovvero
dato x distribuito secondo f(x) generare η.
Consideriamo la funzione integrale normalizzata:
x

∫ f ( q)dq
η = g ( x) =
−1 xmin
xmax

∫ f (q)dq
xmin

Si vede subito che g-1(xmin) = 0 e che g-1(xmax) = 1;


proviamo adesso a calcolare la densità di probabilità
di η. Sappiamo che:

p(η )dη = f ( x )dx


Laboratorio di Calcolo B 82
Il metodo di inversione
Quindi:
dη dg −1 ( x )
p(η ) = p(η ) = f ( x)
dx dx
Ma la derivata di g-1(x) è f(x) da cui:
p(η ) f ( x ) = f ( x ) ⇒ p(η ) = 1
Abbiamo quindi dimostrato che se f(x) è una densità di
probabilità la sua funzione integrale è una variabile
aleatoria distribuita uniformemente in [0,1].
A questo punto dobbiamo essere capaci di invertire g-1
per ottenere g.
Vale la pena di osservare che non esistono motivi per cui
xmin ed xmax non possano tendere all’infinito.
Va osservato pure che il metodo richiede il calcolo
dell’integrale di f, e quindi non si applica alla gaussiana.
Laboratorio di Calcolo B 83
Il metodo di inversione: esempio
Dobbiamo generare numeri distribuiti secondo
un esponenziale negativo in [0,∞]. Calcoliamo g-1:
x

∫ dq
−q
e
η = g −1 ( x ) = 0

= 1 − e− x
∫ dq
−q
e
0

Invertiamo per ottenere g:

g (η ) = − log(1 − η )
Se quindi estraiamo numeri η uniformemente
distribuiti in [0,1] e calcoliamo g(η) otteniamo
numeri distribuiti esponenzialmente in [0,∞].
Laboratorio di Calcolo B 84
Generazione di una gaussiana II
Consideriamo una gaussuana in due dimensioni:
− x2 / 2 − y2 / 2 −( x2 + y2 ) / 2
G ( x, y ) = e e =e
Scritta in coordinate polari diventa:
G ( r ,θ ) = e − r2 / 2

Questa funzione si può integrare:


∞ ∞ 2π ∞

∫ ∫ G( x, y )dxdy = ∫ ∫ G( r,θ )rdrdθ =


− ∞− ∞ 0 0
∞ ∞
2π ∫ e −r / 2 rdr = 2π ∫ e −u du
2

0 0

Laboratorio di Calcolo B 85
Generazione di una gaussiana II
La ricetta da seguire è quindi:
• Si generano due numeri θ e u, uno distribuito
uniformemente in [0,2π], l’altro esponenzialmente in
[0,∞].
• Si convertono questi numeri in coordinate
cartesiane e si ottengono due numeri x e y
distribuiti gaussianamente; in formule:

u = − log(1 − η1 )
r = 2u
θ = 2πη2
x = r cos(θ )
y = r sin(θ )
Laboratorio di Calcolo B 86
Traccia per l’esperienza
• Generare una distribuzione arbitraria
usando il metodo di reiezione.
• Generare una distribuzione esponenziale
usando il metodo di inversione.
• Generare una gaussiana usando la
distribuzione bi-dimensionale.
• Verificare con un fit la correttezza delle
distribuzioni ottenute nei tre casi.
• La generazione di una distribuzione
gaussiana in due dimensioni è una buona
occasione per familiarizzare con gli
istogrammi bi-dimensionali.

Laboratorio di Calcolo B 87

Potrebbero piacerti anche