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