Metodi Computazionali
Generazione di numeri pseudocasuali
A.A. 2009/2010
Pseudo random numbers
I più comuni generatori di numeri random
determinano il prossimo numero random di una
serie come una funzione del precedente:
I numeri random generati sono deterministici.
Cioè la sequenza di numeri è conosciuta a priori
dato il numero iniziale, chiamato seed. Per questo
motivo vengono chiamati pseudo-random.
Pseudo random numbers (1)
Uno
dei più comuni approcci per generare
numeri pseudocasuali consiste nel:
1.
2.
Definire un valore iniziale x0 (seed)
Stimare ricorsivamente valori successivi di xn
x n = ax n−1 mod m
dove a e m sono interi positivi fissati
€
Esercizio 1: Multiplicative Congruential Method
a=5; m=16; x0=5;
generare 1000 valori pseudocasuali
Multiplicative Congruential Method
function [series] = pseudoCasual(x0, a,
module, total)
series=zeros(1, total);
series(1)=mod(a*x0, module);
for k=2:total
series(k)=mod(a*series(k-1),module);
end
Multiplicative Congruential Method
Risultato
9
13
1
5
9
13
1
5
9
13
1
5
9
13
1
5
…………………………………….
•
Ogni numero xn genereato assume uno dei valori compresi
fra 0 e m-1
•
abbiamo quindi bisogno di normalizzarli di modo che siamo compresi
nell’intervallo [0,1]
Multiplicative Congruential Method
function [series] = pseudoCasual(x0, a,
module, total)
series=zeros(1, total);
series(1)=mod(a*x0, module);
for k=2:total
series(k)=mod(a*series(k-1),module);
End
Variabili comprese in [0,1]
series=series/module;
Plot della distribzione
hist (series(1,1:total)); figure(gcf)
Multiplicative Congruential Method
Risultato
0,5625 0,8125 0,0625 0,3125
0,5625 0,8125 0,0625 0,3125
0,5625 0,8125 0,0625 0,3125
0,5625 0,8125 0,0625 0,3125
…………………………………….
•
Dopo un numero finito di passi i valori generati si ripetono
•
•
•
Dobbiamo scegliere le costanti a e m in modo che, per ogni x0, il
numero di variabili pseudocasuali generate prima di essere “ripetute”
sia molto grande
Guidline: scegliere come numero primo sufficientemente grande
Per una macchina a 32 bit: m=231-1 a=75
Pseudo random numbers (2)
Comprende
sia l’aspetto moltiplicativo che
quello additivo (mixed)
x n = ( ax n−1 + c ) mod m
€
Esercizio 2: Mixed Congruential Method
a=5; m=16; x0=5; c=1;
generare 1000 valori pseudocasuali
Mixed Congruential Method
function [series] = pseudoCasual2(x0, a, c,
module, total)
series=zeros(1, total);
series(1)=mod((a*x0)+c, module);
for k=2:total
series(k)=mod((a*series(k-1)+c),module);
end
series=series/module;
hist (series(1,1:total)); figure(gcf)
Esempio
Consideriamo:
Se X0=5, allora abbiamo:
I primi 8 numeri della sequenza saranno:
3,0,1,6,15,12,13,2,…
I generatori di numeri random hanno un periodo
che è misurato in base al numero di numeri unici,
prima delle ripetizioni. L’esempio ha ciclo 16.
Numeri pseudo casuali per la stima degli
integrali
Il valore di π può essere ottenuto calcolando l’area di un cerchio di raggio 1
Il
disegno rappresenta un cerchio centrato nell’origine (O) inscritto in un
quadrato di lato 1.
Supponiamo
che i punti (·) di coordinate (X,Y) siano uniformemente
distribuiti nel quadrato.
Numeri pseudo casuali per la stima degli
integrali
Consideriamo la probabilità che un punto random nel
quadrato sia contenuto all’interno del cerchio iscritto di
raggio 1
N = numero punti fuori dalla circ.
H = numero punti interni alla circ.
Se generiamo un gran numero di punti random nel
quadrato, la proporzione dei punti che cadono all’interno del
cerchio sarà approssimativamente uguale a
Pseudo-codice C-like
double calculate(int nTrials)
{
int hit = 0;
double x, y, distanceFromOrigin;
for (int i = 1; i <= nTrials; i++)
{
Random number
x = myRand();
between 0 and 1
y = myRand();
Pythagoras theorem
distanceFromOrigin = sqrt(x*x +y*y);
if (distanceFromOrigin <= 1.0) hit++;
}
Inside the quadrant
return 4*(double) hit/nTrials;
}
Esercizio 3: Stima dell’area del cerchio
randn
a. Verificare che P{(X,Y) nel cerchio} tende a π/4;
b. Stimare π
Numeri pseudo casuali per la stima
degli integrali - π
function [piG, probability, countVector] = piGreco(nTrials)
count = 0;
countVector = zeros(1,nTrials);
for i=1: nTrials
x = rand();
y = rand();
distanceFromOrigin = sqrt(x*x +y*y);
if distanceFromOrigin <= 1
count=count+1;
end
countVector(i)=count/nTrials;
end
piG= 4*count/nTrials;
probability=count/nTrials;
hist (countVector(1,1:nTrials)); figure(gcf)
Simulazione….
Eseguire l’applet che trovate nella cartella pi_greco per vedere la simulazione
Generazione di variabili casuali discrete
A prob 0,2
B prob 0,15
X =
C prob 0,25
D prob 0,4
€
Esercizio 4: Generazione di una variabile casuale discreta
- Qual è il metodo di generazione più efficiente?
Generazione di variabili casuali discrete (1)
function [A, B, C, D, confronti] = discreteRandomNumber(nTrials)
confronti=0;
A=0; B=0; C=0; D=0;
for i=1:nTrials
U=rand;
if U<0.20
A=A+1;
confronti=confronti+1;
else
if U<(0.10+0.15)
B=B+1;
confronti=confronti+1;
else
if U<(0.20+0.15+0.25)
C=C+1;
confronti=confronti+1;
else
D=D+1;
end
end
end
end
Generazione di variabili casuali discrete (2)
function [A, B, C, D, confronti] = discreteRandomNumber2(nTrials)
confronti=0;
A=0; B=0; C=0; D=0;
for i=1:nTrials
U=randn;
if U<0.40
D=D+1;
confronti=confronti+1;
else
if U<(0.40+0.25)
C=C+1;
confronti=confronti+1;
else
if U<(0.40+ 0.25 + 0.20)
A=A+1;
confronti=confronti+1;
else
B=B+1;
end
end
end
end
Esercizio
Generating
Step 0: creare un vettore di 100 elementi di
valori random usando Multiplicative
Congruential Method con m=231-1 e a=75
9
a random permutation
15
17
…
…
Considerando che ogni numero può essere
permutato con qualsiasi altro numero con
probabilità uniforme, effettuare n=15
permutazioni