CAPITOLUL 3
3.1.2.
Metode de generare a numerelor aleatoare
Principalele
clase de metode de generare a numerelor aleatoare sunt: metode manuale, metode
fizice, metode de memorizare, metode analitice.
Metodele manuale folosesc diferite dispozitive ca: zaruri, urne cu
bilete, rulete etc. Un procedeu cunoscut constă în utilizarea unui cilindru
prismatic omogen cu 10 fețe numerotate de la 0 la 9. Se aruncă succesiv
printr-un mecanism, aleator acest cilindru marcat, obținându-se aleator una din
fețele acestuia. Prin acest procedeu se obțin de fapt numere pseudoaleatoare
deoarece intervine neomogenitatea perfectă a cilindrului, uzura în timp a
cilindrului etc. care face ca în timp numerele să nu mai aibă probabilități
egale de apariție. Metodele manuale se folosesc rar în simularea numerică
datorită vitezei reduse.
Metodele fizice se bazează pe analogii dintre unele procese fizice
intrinsec întâmplătoare (procese radioactive, procese electronice generatoare
de zgomot alb etc.).
Se poate
genera un șir de numere U1, U2, ... , Un, ...,
unde U
Î (0,1) după cum un detector de particole radioactive
înregistrează într-o perioadă determinată de timp Δt, un număr par sau
impar de particole emise de sursă. Se știe că probabilitatea ca să se detecteze
k particole în intervalul de timp Δt este dată de legea Poisson
|
|
Probabilitatea
ca să se obțină un număr par de particole este
![]()
Aceasta
înseamnă că trebuie să minimizăm valoarea e-2λΔt dacă
dorim ca 0 și 1 să apară cu probabilități egale, după un număr dat de pași, cu
o eroare oricât de mică dorim.
Dacă de
exemplu dorim ca abaterea e-λΔt să fie sub 10-3
vom avea
e-2λΔt = 10-3 de unde
rezultă că -2λΔt = -3ln10 și -3(2,3)
Þ λΔt
» 3,45
Deoarece
λΔt = rezultă că trebuie
ales intervalul de timp Δt astfel încât să se detecteze în medie cel puțin
4 particole.
Aceste șiruri de numere satisfac în cea mai mare măsură
caracterul aleator, dar au dezavantajul că nu sunt reproductibile.
Metode de memorizare. O tabelă cu peste 40000 de numere aleatoare "luate
la întâmplare din rapoartele de cens" a fost publicată în 1927 de către
L.H.C. Tippett. Apoi au fost concepute și unele mecanisme care să genereze în
mod mecanic numere aleatoare. Prima mașină de acest gen a fost folosită în 1939
de către M. G. Kendall și B. Babington-Smith pentru realizarea unei tabele de
100000 de numere aleatoare. În anul 1955, RAND Corporation a publicat o tabelă
larg întrebuințată, care cuprindea un milion de cifre obținute cu ajutorul unui
alt dispozitiv special. O faimoasă mașină de generare a numerelor aleatoare
(numită ERNIE) a fost folosită pentru extragerea numerelor câștigătoare din
cadrul loteriei British Premium Savings Bonds.
Metodele de
memorizare a numerelor aleatoare (tabelele) folosesc de regulă memoria internă
sau externă a calculatoarelor. Oferă avantajul reproductibilității.
Prin
combinarea metodelor fizice cu memorizarea pe discuri sau benzi se obțin rezultate
bune din punct de vedere al preciziei, dar timpul de rulare al programului
crește datorită duratei relativ mare de acces la fiecare înregistrare din
memoria externă.
Se pot folosi
și alte tabele ca de exemplu: cartea de telefoane, tabelele de logaritmi etc.
dar numai după efectuarea unor teste de uniformitate
Procedee analitice, folosesc relații de recurență. Un șir de numere (Un)nÎ N*
se numește șir de numere pseudoaleatoare dacă există o anumită formulă de
recurență și un număr natural fix k astfel încât
Un
= f(Un-1 ... , Un-k), n
³ k + 1
Șirul (Un), 1
£ n
£ k astfel obținut,
posedă proprietățile statistice ale unui șir de valori (alese independent) ale
unei variabile aleatoare uniform repartizate sau supusă unei anumite legi de
repartiție.
Există
diverse procedee analitice de obținere a numerelor pseudoaleatoare uniform
repartizate, procedee care au fost algoritmizate și programate pentru
calculatoarele electronice existente.
Un neajuns al
acestor algoritmi este că, în aplicarea concretă pe calculator, conduc după un
anumit număr de generări la șiruri periodice. Aceasta înseamnă că într-un șir
foarte mare de numere pseudoaleatoare există h numere U1, U2,
.... , Uh cu proprietatea Ui
¹ Uj pentru orice i și j aparținând mulțimii
{1,2,...,h}. În continuare, însă Uh+1 = U1, Uh+2
= U2 etc.
Dacă se repetă la un moment dat s numere (s fiind numărul
de valori inițiale), evident că se repetă întregul subșir de h numere.
Numărul h
reprezintă lungimea intervalului de aperiodicitate. Lungimea perioadei este
h-s. Pentru a nu se obține rezultate eronate este necesar ca șirul generat de
numere aleatoare necesar simulării, să nu depășească lungimea perioadei (h-s),
adică: N < h-s unde N reprezintă numărul maxim de cicluri necesare
efectuării simulării, în ipoteza că în fiecare ciclu se folosește în calcule un
singur număr aleator. Dacă această restricție nu este îndeplinită, este necesar
să se considere un alt sistem de s numere inițiale (neincluse în aceeași
secvență în șirul generat) și să se genereze un alt șir de numere
pseudoaleatoare. Operația se repetă până când se obțin cele N numere necesare.
Una din cele
mai cunoscute metode de generare a numerelor pseudoaleatoare este metoda
propusă în anul 1946 de John von Neumann "a mijlocului pătratului unui
număr" care ține seama de următoarele considerente:
Să presupunem
că folosim o reprezentare în baza b a numerelor întregi cu care lucrăm (de
obicei baza este 2 sau 10) și că toate aceste numere au 2a cifre (a =
1,2...)(cel puțin după completarea adecvată cu cifre zero în fața numărului).
Fiind dat
numărul pseudoaleator întreg Un, următorul număr pseudoaleator Un+1
se definește după von Neumann ca fiind format din cifrele părții de mijloc a
pătratului lui Un. Ridicând la pătrat pe Un se obține un
număr cu 4a cifre, luându-se cele 2a cifre de la mijlocul șirului de 4a cifre
ale lui se obține numărul Un+1.
|
|
(3.1)
unde [u] partea întreagă a lui u.
Metoda cere
numai o singură valoare inițială U0 și are la bază o relație simpla
de calcul (3.1). Se recomandă ca 2a = 8 și că la cel puțin două cifre ale
numărului să fie diferite de zero și anume prima cifră obligatoriu
¹ 0 și cel puțin una pe la mijlocul numărului.
Ea este însă
o sursă slabă de numere pseudoaleatoare deoarece prin acest procedeu de calcul
anumite numere se reproduc. De exemplu, când a = 2, b = 10 numărul 3792 se
reproduce 37922 = 14379264
Condițiile de
repetabilitate sunt stabilite prin studierea ecuației diofantice
x2
- bax = r + b3a · k
unde ținând seama de condițiile de repetabilitate avem:
|
|
Knuth [25] a
demonstrat că a construi o sursă fiabilă de numere aleatoare nu este o
întreprindere ușoară. Numerele aleatoare nu se pot produce cu ajutorul
calculatoarelor electronice prin metode alese la întâmplare, ci trebuie ca
metodele de generare a acestora să se bazeze pe teorii riguroase.
Printre
metodele recurente de generare a numerelor aleatoare, cele care au fost
studiate riguros din punct de vedere teoretic și au condus practic la
rezultate bune, sunt metodele congruențiale. Acestea au fost inițiate de D.H.
Lehmer în anul 1949. Aceste metode utilizează teoria claselor de resturi și
sunt cele mai răspândite.
Datorită
faptului că într-un calculator un număr real poate fi reprezentat numai cu un
anumit număr de zecimale, vom genera de fapt numere întregi xn
cuprinse între 0 și un număr oarecare dat m și apoi cu ajutorul relației:
|
|
vom obține numere aleatoare cuprinse între zero și unu.
De obicei m este dimensiunea cuvântului de calculator (adică numărul de valori
distincte ce pot fi memorate într-un cuvânt de calculator) și prin urmare, xn
poate fi considerat drept conținutul întreg al unui cuvânt de calculator cu
punctul bazei poziționat în dreapta iar un poate fi considerat
conținutul aceluiași cuvânt cu punctul bazei poziționat în stânga.
Naylor [35]
(1966) clasifică metodele congruențiale în: metode congruențiale aditive,
multiplicative și mixte.
Metodele congruențiale aditive
Se dau r
numere inițiale: x1, x2, ... , xr și se generează numere întregi
pseudoaleatoare prin formula recursivă:
xi
º (xi-1 + xi-r) (mod m), i
Î {r+1, r+2, ..}, m
Î N*, unde m este o constantă întreagă, număr prim foarte
mare, sau
xr+1
º (x1 + x2 + ... + xr)
(mod m)
xr+2
º (x2 + x3 + ... + xr+1)
(mod m)
xr+3
º (x3 + x4 + ... + xr+1 +
xr+2) ( mod m)
:
:
:
În general
această metodă dă rezultate slabe.
Metode congruențiale multiplicative, au la bază sistemul de numere magice : [x0,
a, 0, m] unde:
m, - modulul; m > 0
a, -
multiplicatorul; 0
£ a < m
x0,
- termenul inițial; 0
£ x0 < m
Generarea
numerelor pseudoaleatoare consecutive se face după relația
xi+1
º a xi (mod m), i
Î {2,3,..}
Metode congruențiale mixte
Aceasta
metodă are la bază sistemul de numere [x0, a, c, m] unde x0, a și m sunt mărimile
definite anterior iar c o constantă
întreagă. Numerele generate folosesc clasele de resturi modulo m după relația:
xi+1
= (axi + c) (mod m), i
Î {2, 3, ... , 4}
Șirul obținut
cu ajutorul acestei relații se numește șir congruențial liniar.
Dacă m=10 și
x0 = a = c = 7 șirul obținut va fi 7, 6, 9, 0, 7, 6, 9, 0, ....
Așa cum se
observă, sinul generat nu este "aleator" pentru orice alegere a lui
m, a, c și x0, existând principii teoretice și practice riguroase de
alegere corespunzătoare a celor patru numere [25]. Exemplul ilustrează faptul
că, întotdeauna, șirurile congruențiale liniare vor intra într-o buclă. Această proprietate este comună tuturor
șirurilor care sunt de forma xn+1=f(xn). Ciclul care se
repetă se numește perioadă. Un șir suficient de aleator va avea întotdeauna o
perioadă relativ mare.
O
generalizare a relației de recurență a metodei congruențiale mixte este:
xn+k
= (akxn + (ak - 1).c/b)(mod m)
k
³ 0, n
³ 0, b = a-1.
Scopul
fiecărui generator de numere aleatoare este de a obține șiruri de numere a
căror perioadă să aibă lungime maximă. Următoarea teoremă dă o caracterizare
riguroasă a situațiilor în care poate fi realizată perioada de lungime maximă.
Teorema A
Șirul congruențial liniar definit de [x0,
a, c, m] are perioada de lungime maximă dacă și numai dacă:
i)
c și m sunt două numere întregi prime între ele;
ii) b = a-1 este un multiplu de p, pentru
orice număr prim p care divide pe m;
iii) b este multiplu de 4 dacă m este
multiplu de 4.
Demonstrația
teoremei este dată în lucrarea "Tratat de programare a
calculatoarelor" de Donald E. Knuth, Editura tehnică, București 1983.
În cazul
generatorilor multiplicativi (c = 0) procesul de generare al numerelor
aleatoare este mai rapid, lungimea maximă a perioadei numerelor generate este
relativ mică.
Realizarea
unei perioade suficient de mari, presupune îndeplinirea anumitor condiții de
către multiplicatorul a.
Fie λ(m)
ordinul unui element primitiv, adică maxim posibil modulo m.
Dacă a și m
sunt două numere prime între ele, atunci cel mai mic număr întreg
λ pentru care aλ
º 1 (modulo m) este numit, prin convenție ordinul lui a modulo m. Orice
astfel de număr a care are ordinul modulo m maxim posibil este numit element
primitiv modulo m.
Din teorema lui Euler rezultă că λ(pe)
este un divizor al numărului pe-1•(p-1). În acest caz
λ(2) = 1, λ(4) = 2, λ(2e) = 2e-2 dacă e
³ 3; λ(pe) = pe-1(p-1), dacă p
> 2, λ(p1e1
... piei) = c.m.m.m.c. (λ(p1e1),
... , λ(piei))
Teorema B [R.D. Carmichael].
Lungimea maximă posibilă a perioadei
pentru cazul în care c = 0, este λ(m) definit ca mai sus. Perioada de
lungime maximă este realizată dacă:
i) x0 și m sunt prime între
ele;
ii) a este element primitiv modulo m.
Dacă m este
număr prim, atunci putem obține o perioadă de lungime m-1, această valoare este
doar cu o unitate mai mică decât lungimea maximă a perioadei și, prin urmare, o
astfel de perioadă este potrivită oricărui scop practic.
Modul de
construire a unor generatori multiplicativi congruențiali este prezentat de
Văuva Ion în "Modele de simulare cu
calculatorul", Editura tehnică București, 1977 și Knuth E. Donald în
"Tratat de programarea calculatoarelor", Editura tehnică, București,
1983. Dintre aceștia, un generator performant care satisface condițiile
necesare este generatorul RND de forma [x0,16807,0,231-1]
modulul m = 231-1 fiind cel mai apropiat număr prim de cuvântul
calculatoarelor FELIX C - 256 și IBM - 360. Acest generator este programat în
limbajul ASSIRIS și este accesibil pentru calculatoarele Felix C - 256.
Subrutina RND(IX,YFL) generează o valoare de selecție YFL uniformă pe (0,1),
utilizând ca număr de pornire ("sămânța") pe IX, 0<IX<231-1
iar apelarea ei este făcută din orice program FORTRAN prin CALL RND (IX,YFL).
O altă
subrutină sau generator de numere aleatoare este RANDU de forma [X0,1230703125,0,231-1]
iar apelarea din programe FORTRAN este realizată prin CALL RANDU (IX, IY,YFL)
în care:
- IX este numărul de pornire (Număr întreg
impar cu mai puțin de 9 cifre); numărul IX trebuie definit (recursiv sau nu)
înainte de orice apelare a subrutinei;
- IY număr întreg obținut prin RANDU și are
o valoare cuprinsă între 1 și 231-1. El poate fi utilizat la o nouă
apelare a subrutinei când IX = IY din apelarea precedentă;
- YFL număr aleator în intervalul (0,1)
obținut de subrutină.
În continuare
vom da secvența instrucțiunilor FORTRAN pentru generarea a 10 numere aleatoare
uniform distribuite în intervalul (0,1) și instrucțiunile subrutinei RANDU.
IX = 12341
DO 1
I=1,10
CALL
RANDU (IX,IY,YFL)
IX=IY
WRITE (3,
200) YFL
200 FORMAT (10X,
F10.8)
1 CONTINUE
STOP
END
SUBROUTINE
RANDU (IX,IY,YFL)
IY = IX *
1230703125
IF(IY)
10,20,20
10 IY = IY + 2147483647 + 1
20 YFL = IY * 0.4656613E - 9
RETURN*
END
Fiecare limbaj de simulare și aproape fiecare limbaj de
programare își are propriul său generator de numere aleatoare uniform
distribuite.
În Anexa 1 se prezintă posibilitățile
oferite de limbajul C+, pentru generarea numerelor aleatoare uniform
distribuite.
O altă
posibilitate de a obține șiruri pseudoaleatoare uniform distribuite în
intervalul [0,1] este oferită de metodele comparative. În acest caz se
presupune că dispunem de n numere pseudoaleatoare repartizate uniform în
intervalul [0,1] U1, U2, ... , Un. În acest
caz numărul Un+p se obține după următorul algoritm:
Pasul 1.
Se citește
șirul inițial: U1, U2, ... , Un (n
³ 100)
Pasul 2.
Dacă Un+p
£ Up+1 atunci Un+p+1 = Un+p
+ (1 - Un+p)Up+2
În caz
contrar se trece la pasul 3.
Pasul 3.
Un+p+1
= Un+p • Up+3
Pasul 4.
Se reia algoritmul
de la pasul 2 până când se ajunge la lungimea dorită a șirului de numere
pseudoaleatoare.
Pentru a
îmbunătăți calitatea numerelor generate, se pot utiliza metodele combinaționale
de generare a numerelor pseudoaleatoare uniform repartizate.
De exemplu,
un algoritm cu doi generatori (G1 și G2) are următorii pași:
Pasul 0.
Se
inițializează programul cu p numere uniform distribuite în intervalul [0,1]: U1,
U2, ... , Up.
Pasul 1.
Cu ajutorul
lui G1 se generează un număr întreg, pseudoaleatoar, uniform repartizate pe
intervalul [1,p].
Numărul
generat n este folosit ca indice pentru a extrage din p numere pseudoaleatoare
uniform repartizate, un număr, care se înregistrează în secvențe de numere
utilizate în modelul de simulare.
Pasul 2.
Al doilea
generator G2, bazat pe metoda multiplicativă, generează un nou număr uniform
repartizat pe [0,1] care înlocuiește numărul extras la pasul 1, astfel ca să se
completeze șirul celor p numere pseudoaleatoare uniform repartizate.
Pasul 3.
Se repetă
pasul 1 și 2 ori de câte ori este necesar astfel încât să se obțină lungimea
dorită a șirului de numere necesare simulării.