CAPITOLUL 3

 

3.1.2. Metode de generare a numerelor aleatoare

 

       Principalele clase de metode de gene­rare 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

 

2

       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 calculatoare­lor. Oferă avantajul reproductibilității.

       Prin combinarea metodelor fizice cu memori­zarea pe discuri sau benzi se obțin rezul­tate 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 repro­duc. 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:

   

        Mai mulți cercetători au studiat această metodă la începutul anilor '50. Lucrând cu numere de patru cifre în loc de 10, G. E. Forsythe a încercat 16 valori de start diferite și a găsit că 12 dintre ele conduc la șiruri care au ciclul 6100, 2100, 4100, 8100, 6100, .... , în timp ce două dintre ele au degenerat luând valoarea zero. N. Metropolis folosind sistemul de numerație binar a arătat că atunci când sunt utilizate numere formate din 20 de biți există 13 cicluri distincte în care șirul degenerează, dintre care cel mai lung are perioada de lungime 142. Lucrând cu numere de 38 de biți, Metropolis a obținut un șir de aproximativ 750000 de numere înaintea apariției procesului de degenerare, iar cei 750000 x 38 biți rezultați au îndeplinit testele statistice asupra caracterului aleator. Aceasta arată că metoda "mijlocului pătratului unui număr întreg" poate da rezultate utilizabile, dar este destul de riscant să i se acorde prea multă încredere înainte de a o testa minuțios.

       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 acesto­ra să se bazeze pe teorii riguroase.

       Printre metodele recurente de generare a numerelor aleatoare, cele care au fost studiate riguros din punct de vedere teore­tic ș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 restu­ri ș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 con­gruenț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ă. Nume­rele 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 perfor­mant 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 pseudoalea­toare uniform repartizate.

       De exemplu, un algoritm cu doi genera­tori (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 pseudo­aleatoare 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.