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