Numeri pseudocasuali
“Numeri casuali non devono essere generati con un metodo scelto a caso” D.Knuth
• Il periodo deve essere il pi` u lungo possibile;
• la distribuzione deve essere uniforme in [0, 1]
p(x)=costante in [0, 1];
• le correlazioni devono essere trascurabili
D
x
n+1· x
nE−
Dx
n+1Ehx
ni = 0;
• distribuzioni uniformi:
– metodi lineari congruenti;
– metodi Fibonacci lagged;
– metodi non lineari, etc
• distribuzioni non uniformi:
– distribuzione gaussiana e metodo di Box- M¨ uller
– distribuzione qualsiasi;
Metodi lineari congruenti (LCM)
• x
n+1= (a · x
n+ b) mod m;
• di solito b = 0;
• a ` e primo;
• m ` e primo, oppure m = 2
nProblema
overflow per moltiplicazione per a.
Soluzione
m = a · q + r con r < q scrivo x
n= z · q + w allora
a · x
n= a · (z · q + w) = a · q · z + a · w = (a · q + r) · z − r · z + a · w
a · x
n= m · z − r · z + a · w
con r · z < q · z < x
n< m e a · w < a · q < m
Quindi a · w − r · z ` e minore di m ed il risulato ` e a · x
nmod m = a · w − r · z(+m) =
a · (x
nmod m) − r · (x
n/q) (+m) Esempio:
a = 16807 m = 2
31= 2147483648
Metodi Fibonacci lagged
x
n+1=
XN q=0
a
qx
n−q• Simili alla successione di Fibonacci, ma con pi` u termini; di solito solo un paio di c
ksono diversi da zero;
• occorre una certa attenzione alle condizioni iniziali; si pu` o provare a usare LCM come
”starter” per i primi termini;
• hanno periodo molto lungo e scarse corre- lazioni;
• pi` u successioni indipendenti con la stessa
regola;
Esempio: r250
• x
n=
P250j=1a
qx
n−q• periodo N ≈ 2
250• a
q= 0 escluso che per q = 103, 250 per cui a
q= 1
• quindi x
n= x
n−103+ x
n−250• in realt` a si usa xor: x
n= x
n−103xor x
n−250• memorizzo gli ultimi 250 termini in uno
stack circolare per non dover spostare ad
ogni passo un intero vettore
Metodo di Box-M¨ uller
Voglio una distribuzione gaussiana: se x
1e x
2sono distribuite uniformemente in (0, 1) definisco
y1 = p
−2 ln x1sin(2πx2) y2 = p
−2 ln x1 cos(2πx2)
Quindi x
1= e
−(y12+y22)/2e p(y
1) p(y
2) dy
1dy
2= p(x
1) p(x
2) dx
1dx
2= dx
1dx
2p(y
1) p(y
2) ∂(y
1, y
2)
∂(x
1, x
2) = 1
∂(y1, y2)
∂(x1, x2) =
¯¯
¯¯
¯
−1 x1
√−2 ln x1 sin(2πx2) 2π√
−2 ln x1cos(2πx2)
−1 x1
√−2 ln x1 cos(2πx2) −2π√
−2 ln x1 sin(2πx2)
¯¯
¯¯
¯
∂(y
1, y
2)
∂(x
1, x
2) = 2π x
1Percio‘ p(y1) p(y2) = x1 = 1
2πe−(y12+y22)/2 p(y1) = 1
√2πe−y12/2 p(y2) = 1
√2πe−y22/2
Distribuzioni qualsiasi
Se voglio ottenere una distribuzione con pro- babilit` a p(x) arbitraria limitata superiormente.
• suppongo che mi interessi 0 ≤ x ≤ a
• suppongo che p(x) ≤ b ∀x in [0, a]
• scelgo un numero a caso x con distribuzione uniforme nel range [0, a]
• scelgo un secondo numero a caso y con y²[0, b]
• se y < p(x) accetto il numero, altrimenti
procedo con altri due numeri
Applicazioni
Integrazione con numeri pseudocasuali Data f (x) voglio calcolare
Z b
a
f (x) dx
dove so che f (x) ` e compresa tra zero e f
max.
• genero coppie di numeri che corrispondono a un punto nel rettangolo che ha lati tra a e b e tra zero e f
max.
• calcolo la percentuale P di punti che cadono sotto la curva y = f (x)
• l’integrale vale P · (b − a) · f
maxTest di uniformit` a e correlazioni
0 0.5 1
x 0.0496
0.0498 0.05 0.0502 0.0504
frazione
0 0.2 0.4 0.6 0.8 1
x n