Sunteți pe pagina 1din 32

Modelarea sistemelor de calcul

Curs, anul III Calculatoare

Generarea numerelor aleatoare.


Date de intrare in simularea
dinamica discreta
Fie un SED pentru care stim ca timpul necesar
servirii unui client este cuprins intre 10 si 20 de
minute, fiind distribuit uniform (media fiind 15
minute). Cum putem determina timpii de servire
ai primilor 100 clienti – ca date de baza de
intrare pentru simularea SDED?
 Recurgand din nou la sistemul si procesul real
si la colectarea datelor
 Prin generarea automata (distributionala), cu
grija de a respecta parametrii procesului real
Colectarea datelor
In general grea, costisitoare, frustranta – in plus:
 Sistemul real poate sa nu existe
 Datele sunt din sisteme/ procese “similare” modelului si
nu exact coincidente, disponibilitatea lor poate impune
chiar schimbarea modelului
 Datele pot fi incomplete sau prea “incarcate” (zgomot
sau cantitati mari de date)
Iesirile sunt sensibile la incertitudinea intrarilor
(“garbage in, garbage out”)
Gradul de acuratete (detaliere) al modelului este
dependent (si) de calitatea datelor
 Variabilitatea datelor e o conditie a validitatii modelului
Generarea datelor
In exemplul anterior, am putea folosi la fel de
bine un sir de 100 de numere aleatoare uniform
distribuite intre 10 si 20, cu media “apropiata” de
15 (cu atat mai apropiata cu cat numarul lor este
mai mare)
Apare ca metoda generala aceea de a desprinde
observatii sintetice din proces pentru a genera
date de intrare pentru model
Problema este de a “potrivi” datele generate cu
cele observate
 datele de intrare generate trebuie si validate!
Discutie
Este clar ca in multe cazuri simularea implica
elemente aleatoare/ stochastice
In exemplul anterior, nu stim apriori cat va lua
servirea unui client, dar stim ca timpul de servire
urmeaza o distributie de probabilitate
Fiindca modelul de simulare este oricum o
aproximare, scopul generarii n.a. si v.a. este sa
aproximam “corect” datele de intrare
“Corect” inseamna ca generarea de numere si
variabile aleatoare trebuie sa produca dintr-o
formula distributionala un set de esantioane
(numerice), avand doua proprietati importante
Proprietatile esantioanelor
Identitatea distributiei (uniformitate): Esantioanele
produse trebuie sa aiba aceeasi distributie ca si
datele reale din proces
 in termeni statistici, c.p. media si varianta esantionului
sunt aceleasi cu media si varianta populatiei de intrare
Independenta: Cand un set de esantioane este
plasat in secventa in care este produs, nu trebuie
sa existe vreun sablon (chiar si neintentionat!) de
repetare a acelei secvente
Cum garantam similaritatea
distributiei cu datele?
Presupunem ca datele ce pot fi culese din sistem
sunt IID (independente si identic distribuite)
Mai intai se incearca gasirea unei distributii de
probabilitate, ce va fi apoi utilizata in generarea
intrarilor modelului de simulare
Cea mai buna distributie “teoretica” este cea
care se potriveste cel mai bine cu cea a datelor
empirice (culese)
“Adecvarea” distributiei teoretice (tip, parametri)
cu datele empirice este uneori dificila
Metoda histogramelor
Modalitate simpla de a vedea daca un esantion
de date este adecvat unei distributii; etape:
 Se deseneaza histograma frecventelor aparitiei datelor
 Se estimeaza parametrii unei distributii posibile
 Se deseneaza functia densitatii de probabilitate
 Se determina cat de similare sunt cele doua forme
frecvente

valori ale datelor


Testul Hi-patrat
Oi

frecvente
Formalizeaza notiunea ant. de
similaritate a distributiilor
 Oi reprezinta numarul valorilor
de date observate in cel de-al
valori ale
i-lea interval (sunt k intervale)
 pi este prob. ca o valoare sa
pi datelor
intre in cel de-al i-lea interval
sub distributia ipotetica

pdf
 Ar fi de asteptat sa observam
in intervalul I, Ei = npi, dintr-un
total de n observatii
valori ale datelor
 Daca pp. distributionala este
2
corecta, atunci χ02 urmeaza o k
 Oi − Ei 
distr.χ2 cu k-s-1 gr.de libertate χ = ∑
2
0 
(s e nr.parametrilor distributiei i =1  Ei 
ipotetice)
Generarea numerelor aleatoare
Apare ca instrument de lucru in cazul sistemelor si
proceselor stochastice (nedeterministe) – ce necesita
modele cu elemente stochastice
Implica utilizarea distributiilor de probabilitate ca
elemente de baza de modelare
Larg utilizata si in alte domenii:
 Simularea statica (Monte-Carlo) – de ex. calculul lui π
 Analiza probabilistica a algoritmilor – cu conditia sa putem
caracteriza in mod rezonabil distributia datelor de intrare
 Criptografia – la baza constructiei cheilor de criptare si a
altor parametri ai algoritmilor si protocoalelor criptografice
...
Ce este un numar “aleator”?
Nu putem spune ca un anumit numar este aleator
“Aleatorizarea” (randomness) este un proces
nedeterminist ce produce astfel de numere (fara
insa a putea fi siguri niciodata asupra urmatoarei
valori produse)
Surse bune de numere pur
aleatoare: ruleta, dar si alte
dispozitive fizice (electronice,
radioactive) mult mai rapide
 Totusi, acestea sunt foarte greu
de utilizat in simulare
Numere pseudo-aleatoare
Cel mai important in simulari, care de obicei se
fac pentru a compara diverse evolutii ale unui
sistem, este pastrarea conditiilor de operare
Aceste conditii sunt influentate de esantioanele
datelor de intrare, la randul lor determinate de
numerele aleatoare folosite
⇒trebuie pastrata sursa de numere aleatoare in
toate simularile
⇒chiar daca sunt pseudo-aleatoare (generate de
algoritmi - deterministi) acestea trebuie sa
satisfaca anumite proprietati statistice
Proprietati ale unui “bun” generator
si numerelor aleatoare generate
Numerele generate trebuie sa fie independente statistic
(fara autocorelare)
Generatorul trebuie sa fie rapid
Memoria necesara algoritmului de generare nu trebuie
sa fie excesiva
Perioada de repetitie a numerelor generate trebuie sa fie
suficient de mare
Pericolul degenerarii sirului de numere trebuie eliminat
(nu trebuie ca de la un anumit rang, numerele sa nu mai
respecte conditiile impuse)
Sirul de numere aleatoare trebuie sa fie reproductibil
Metode analitice de generare a n.a.(1)
Mijlocul patratului (Von Neumann)
 Un numar initial (seed) este ridicat la patrat, si cifrele
din mijloc formeaza primul n.a. (prin repozitionarea
punctului zecimal se poate obtine un numar intre 0 si
1); acesta se ridica din nou la patrat si se obtine prin
aceeasi tehnica al doilea n.a., iar procedeul continua
 Sursa slaba de n.a. – prin faptul ca anumite secvente

de numere aleatoare se repeta


 Pornind de la ideea de baza, s-au construit algoritmi

mai buni, bazati pe metode recurente de generare


Exemplul 1
X0 = 9524 (seed)
X02 = 95242 = 90706576  X1=7065
R1= 0.7065
X12 = 70652 = 49914225  X2=9142
R2 = 0.9142
X22= 91422=83576164  X3 = 5761
R3 = 0.5761

Exemplul 2
X0 = 1258 (seed)
1258, la patrat = 1582564
5825 33930625
9306 86601636
6016 36192256
1922 3694084
6940 48163600
1636 2676496
6764.....

Probleme ale algoritmului “mid-square”.
Repetarea secventelor
Exemplu
X0 = 5197
X02 = 51972 = 27008809  X1=0088
R1= 0.0088
X12 = 882 = 00007744  X2=0077
R2= 0.0077
X22= 772=00005929  X3 = 0059
R3 = 0.0059
Zero-urile dupa punct apar in fiecare n.a. Ri din sir
Probleme ale algoritmului “mid-square”.
Degenerarea sirului
Exemplu
Xi = 6500
Xi2 = 65002 = 42250000  Xi+1=2500
Ri= 0.2500
Xi+12 = 25002 = 06250000  Xi+2=2500
Ri+1=0.2500
...
Toate valorile ulterioare ale lui Xi, Ri vor fi 2500
Concluzie: algoritmul mid-square nu este bun!
Metode analitice de generare a n.a.(2):
Metode congruentiale liniare (Lehmer,1951)
LCG produc secvente de intregi X1, X2,… intre 0..m -1
conform cu urmatoarea relatie recursiva:
Xi+1 = (aXi + c) mod m, i = 0, 1, 2,…
 Numim valoarea initiala X0 sămânţa generatorului (seed), a
este multiplicatorul constant, c e incrementul, iar m modulul
 Toti parametri sunt intregi
 Dupa cum c ≠ 0 sau c = 0, avem doua forme:
 Metoda congruentiala mixta
 Metoda congruentiala multiplicativa
 Selectia valorilor pentru a, c, m si x0 afecteaza foarte mult
proprietatile statistice si lungimea ciclului
 N.a. distribuite uniform intre 0 si 1, U(0,1) se genereaza cu
relatia: Ui = Xi /m, i = 1, 2, …
Metoda congruentiala mixta
Se caracterizeaza prin c ≠ 0
Exemplu:
O secventa de n.a. cu x0 = 27, a = 17, c = 43,
m = 100
X1 = (17 x 27 + 43) mod 100 = 502 mod 100 = 2
R1 = 2/100 = 0.02
X2 = (17 x 2 + 43) mod 100 = 77 mod 100 = 77
R2 = 77/100 = 0.77
X3 = (17 x 77 + 43) mod 100 = 1352 mod 100 = 52
R3 = 52/100 = 0.52
...
Metoda congruentiala multiplicativa
Se caracterizeaza prin c = 0
Exemplu:
Putem genera n.a. intre 0 si 1 prin aplicarea
relatiei:
xi
x i +1 =
m
si limitarea numarului de cifre zecimale retinut
dupa efectuarea impartirii
Probleme ale LCG
X0=19, Xi+1=(22Xi + 4)mod 63
i 22Xi+4 Xi+1 Ui i 22Xi+4 Xi+1 Ui
-------------------------- ---------------------------
0 19 11 378 0 .0000
1 422 44 .6984 12 4 4 .0635
2 972 27 .4286 13 92 29 .4603

3 598 31 .4921
62 708 15 .2381
4 686 56 .8889 63 334 19 .3016
5 1236 39 .6190 64 422 44 .6984
6 862 43 .6825 …
7 950 5 .0794 Observam: repetarea sirului dupa
8 114 51 .8095 generarea a 64 valori (modulul), dar
9 1126 55 .8730 si faptul ca repetitia valorilor nu s-a
10 1214 17 .2698 produs inainte.
Proprietati generale ale LCG
Orice LCG va cicla (cel mult dupa generarea a m n.a.);
lungimea ciclului s.n. perioada LCG
Perioada maxima pentru un LCG este m
Conditia necesara de a obtine un bun generator este “m
foarte mare”
Perioada este de obicei mai mica decat m
Exemplu:
X0 = 20, Xi+1 = (50Xi + 20)mod 100
X1 = (50*20 + 20)mod 100 = (1020)mod 100 = 20
Conditia “m foarte mare” nu este si suficienta pentru a
obtine un bun generator
Exista conditii generale ce garanteaza un bun generator?
Teorema 1
Un LCG are perioada maxima d.d.:
1. (m,c)=1 – m si c sunt prime intre ele
2. daca exista q, prim, ce divide m, atunci acesta divide a-1
3. daca 4 divide m, atunci 4 divide a-1.
Demonstratia este f. dificila (teorema de numere prime)
Exemplu:
 m=10d, pentru un intreg pozitiv d.

 a se alege din seria 1, 21, 41, 61, 81,.....

 c se alege din seria 1, 3, 7, 9, 11, 13, 17, 19,...


(intregi impari ce nu se divid cu 5)
Aplicatie: demonstrati ca LCG din exemplu verifica
conditiile teoremei
Modalitati de accelerare a LCG
Depasirea (Overflow Division)
 Ideea: intr-un calculator zecimal cu lungimea cuvantului 4,
6000+4001=0001; sau 34561332 mod 10000 = 1332, deci
stocarea pe 4 biti implica efectuarea operatiei modulo
 Putem alege m=2b unde b=lungimea cuvantului calculator
 Exemplu: pentru un PC cu procesor pe 32 de biti, m=232 sau
chiar m=231, tinand cont de lungimea reala (fara semn)
Eliminarea lui c si obtinerea unui LCG multiplicativ
 Totusi, fara c rezultatul din teorema 1 nu are sens
 Exista o teorema ce stabileste conditii asemanatoare pentru
generatoare multiplicative cu modul prim (PMMG)
Teorema 2
Perioada generatorului este m-1 daca:
1. m este cel mai mare numar prim mai mic decat 2b
2. cel mai mic numar k pentru care ak-1 este divizibil
prin m este k=m-1
Exemplu:
 m=231-1, prim; a=75=16807
 Nu putem aplica “overflow division” pt. accelerare
 O metoda apropiata, numita “simulated division”,
asigura practic aceeasi viteza (principiu asemanator)
Modalitate de verificare a n.a. generate
Utilizarea unei simulari pentru a
calcula valoarea numarului π
(pi)
• Fie (x, y) coordonatele unui
punct P din patrat
P(x,y)
• Pentru punctele de pe
circumferinta cercului:
x2 +y2 = r2 y
• Folosind generatorul de n.a. r
pe care il avem, acoperim
patratul prin 10 000 puncte
aleatoare; fie a numarul de x
puncte din sfertul de cerc
Acuratetea determinarii lui pi depinde de
calitatea generatorului de n.a.
Fie a numarul de puncte din sfertul de cerc
Aria sfertului de cerc = Numar de puncte in sfertul de cerc
Aria patrat Numar de puncte in patrat

πr 2
4 = a
P(x,y) r*r 10000
π 12
4 = a
y 1 *1 10000
r a
⇒π =
2500
x
Functii de generare a n.a. in C/C++.
Functiile rand() si srand()
Returneaza valori intregi generate (pseudo) aleator
rand() – returneaza acelasi sir de numere
 Aplica metoda congruentiala multiplicativa (factor 232) si
returneaza secvente de n.a. intre 0..RAND_MAX (constanta
simbolica e definita in stdlib.h, valoarea uzuala este 32767)
 Sirul de numere returnat poate fi schimbat daca se modifica
valoarea implicita a variabilei seed (reinitializare generator)
srand() – face (re)initializarea generatorului de n.a.
 Utilizare: srand(int iSeed)
 iSeed poate fi data explicit, ca o constanta (1=val.implicita),
sau setata diferit la fiecare rulare, in functie de timp
Functia time() si operatorul %
Trebuie inclus header-ul <time.h> ce contine definitia:
“time_t time(time_t *tloc);”, echivalenta cu:
“int time(int *tloc);”
 tloc este locatia de memorie a unei variabile intregi unde poate fi
stocata valoarea generata (optional)
Descriere: time() returneaza valoarea intreaga (in sec.) de
la 1/1/1970, pentru a obtine o valoare diferita a sămânţei
la fiecare rulare a unui program
 Daca tloc ≠ 0, valoarea returnata este si stocata in locatia spre
care pointeaza tloc
Operatorul % (modulo) permite scalarea valorilor:
 rand( ) % 10 ⇒ un n.a. intre 0 si 9 inclusiv
 rand( ) % b + a ⇒ un n.a. intre a si b-1 inclusiv
Exemplu: generarea a 10 numere intre 0..20
// printing 10 random numbers // printing 10 random numbers
// between 0 and 20: // between 0 and 20
// Same numbers each run // Different numbers each run
#include <iostream.h>
#include <iostream.h> #include <time.h>
using namespace std; using namespace std;
main() main()
{ {
int i, iNum; int i = 1;
i=1 // print the time
while ( i<=10 ) cout << time(NULL) << endl;
{ // seed the random number
// generator with the time
iNum = rand() % 21; srand( time(NULL) );
cout << iNum << " "; while( i<=10 )
i++; {
} cout << rand() % 21 << " ";
} i++;
}
}
Tema: Proiect + Referat
Construiti pachetul propriu de rutine de generare
de numere aleatoare; implementati cel putin trei
metode (functii) de generare de n.a.
Implementati functii-criteriu de verificare privind
calitatea numerelor generate
Implementati pe baza generatorului de n.a. 2-3
generatoare de distributii simple (de ex.uniforma,
binomiala, Bernoulli)
Studiati proprietatile esantioanelor generate, prin
comparatie si cu date generate folosind Excel

S-ar putea să vă placă și