Sunteți pe pagina 1din 16

Curs 4

27 octombrie 2020

3 Simularea variabilelor aleatoare


3.1 Metode generale de simulare
Toate tehnicile de simulare pornesc de la premiza că un computer ştie să simuleze o variabilă
aleatoare uniformă pe intervalul [0, 1]. De fapt se simulează prin diferite metode numere pseudo-
aleatoare, pentru ca apoi să se aplice diverse teste pentru a verifica faptul că variabilele aleatoare
generate sunt uniforme. De exemplu, metoda congruenţială liniară utilizeaza numărul mare M ,
şi numerele a şi b. Plecându–se de la un X0 iniţial, se calculează

Xn+1 = (a · Xn + b) (modM ) , (1)

care este o variabilă aleatoare uniformă discretă cu valori posibile de la 1 la M . Evident, de


aici rezultă că U = XMn este uniformă pe intervalul [0, 1].
În Mathcad există variabila seed (funcţia Seed (x) ı̂n versiunile Mathcad mai vechi), unde
valoarea (respectiv x) este un număr ı̂ntre 1 şi 2147483647, care atribuie valori lui a, b, M şi
X0 . Tot ı̂n Mathcad există funcţia rnd (x), care returnează o variabilă uniformă pe intervalul
[0, x].
În Matlab există, analog funcţia rng (samanta), unde samanta poate lua una dintre valorile:

1. 0: se iniţializează generatorul cu sămânţa zero.

2. positive integer: se iniţializează generatorul cu sămânţa egală cu un număr natural nenul.

3. ’default’: se iniţializează generatorul Twister al lui Mersenne, bazat pe numărul prim


al lui Mersenne1 218837 − 1. Se pleacă cu M [0] = samanta (ı̂n acest caz, samânta se
presupune zero), apoi M [n + 1] se calculează recurent cu operaţii pe biţi: de fapt calculăm
2M [n]+1 − 1 ı̂n baza doi la fiecare pas, apoi se extrage un număr de biţi. Acest algoritm are
dezavantajele că are iniţializări multiple, care diferă numai prin valoarea sămânţei nu şi
prin alţi parametri, şi că nu a trecut testele statistice conform cărora variabilele aleatoare
uniforme sunt ı̂ntr–adevăr uniforme.
1
Descoperit ı̂n 1997 de matematicienii japonezi Makoto Matsumoto şi Takuji Nishimura

1
4. ’shuffle’: analog instrucţiunii C + + srand (time (N U LL)), se iniţializează parametrii
metodei congruenţiale liniare pornind de la timpul curent (ceasul computerului). Acesta
va fi ales ı̂n aplicaţii.
5. structure: se iniţializează generatorul bazat pe cele trei câmpuri ale unei structuri —
Type, Seed şi State.

O variabilă aleatoare U uniformă pe [0, 1] se generează cu instrucţiunea U = rand;, unde


punct şi virgulă se pune pentru inhibarea afişării rezultatelor intermediare.
Metoda inversei se bazeaza pe Lema lui Hincin, pe care o prezentăm ı̂n continuare.

Propoziţia 1 (Lema lui Hincin) Dacă X este variabilă aleatoare cu funcţia de repartiţie F ,
atunci variabila aleatoare Y = F (X) este uniformă pe intervalul [0, 1].

Demonstraţie: Fie G funcţia de repartiţie a lui Y . Rezultă


G (y) = P (F (X) ≤ y) = P (X ≤ F −1 (y)) = F ◦ F −1 (y) = y.
Deci G este tocmai funcţia de repartiţie uniformă pe [0, 1], şi propoziţia este demon-
strată 

Prin urmare, dacă ştim formula analitică pentru F −1 , o variabilă aleatoare X cu funcţia de
repartiţie F se generează astfel: se generează U uniform pe [0, 1], pentru ca apoi să calculăm
X = F −1 (U ).
În cazul variabilelor aleatoare discrete, X este valoarea cea mai mare astfel ı̂ncât suma
probabilităţilor până la valoarea respectivă să nu depăşească U .
Programul Mathcad pentru metoda inversei ı̂n cazul variabilei uniforme discrete este următorul

generdiscr (n) := seed ← 23


U ← rnd (1)
S ← n1
X←1
while S < U
X ←X +1
S ← S + n1
return X

Varianta Matlab este următoarea.

function X=gendiscr(n)
rng(’shuffle’);
U=rand;
S=1/n;
X=1;
while S<U
X=X+1;
S=S+1/n;
end
end

2
Apelul ı̂n Mathcad este
U := gendiscr (n),
iar ı̂n Matlab
U = gendiscr (n).
Pentru variabila X ∼ Bin (n, p), programul Mathcad este

generbin (n, p) := seed ← 23


U ← rnd (1)
X←0
pk ← 1
for j ∈ 1..n
pk ← pk · (1 − p)
S ← pk
while S < U
X ←X +1
pk ← pk·(n−X+1)·p
X·(1−p)
S ← S + pk
return X

Varianta Matlab este următoarea.

function X=generbin(n,p)
rng(’shuffle’);
U=rand;
X=0;
pk=1;
for j=1:n
pk=pk*(1-p);
end
S=pk;
while S<U
X=X+1;
pk=pk*p*(n-X+1)/(1-p)/X;
S=S+pk;
end
end

Pentru repartiţia Geom (ρ), programul de simulare este următorul

3
genergeom (ro) := seed ← 23
U ← rnd (1)
X←0
pk ← 1 − ro
S ← 1 − ro
while S < U
X ←X +1
pk ← pk · ro
S ← S + pk
return X

Varianta Matlab este următoarea.

function X=genergeom(ro)
rng(’shuffle’);
U=rand;
X=0;
pk=1-ro;
S=1-ro;
while S<U
X=X+1;
pk=pk*ro;
S=S+pk;
end
end

Pentru variabila aleatoare X ∼ P o (λ), programul Mathcad este

generpo (lambda) := seed ← 23


U ← rnd (1)
X←0
pk ← e−lambda
S ← pk
while S < U
X ←X +1
pk ← pk·lambda
X
S ← S + pk
return X

Varianta Matlab este următoarea.

function X=generpo(lambda)
rng(’shuffle’);
U=rand;
X=0;
pk=1/exp(lambda);

4
S=pk;
while S<U
X=X+1;
pk=pk*lambda/X;
S=S+pk;
end
end

În cazul variabilei uniforme discrete, se ţine cont că dacă U ∈ [0, 1], atunci n·U ∈ [0, n]. Deci
variabila uniform discretă este X = dn · U e (partea ı̂ntreagă superioară a lui n · U ). Programul
Mathcad este următorul.
generdiscr1 (n) := seed ← 23
U ← rnd (1)
X ← ceil (n · U )
return X

Varianta Matlab este următoarea.

function X=gendiscr1(n)
rng(’shuffle’);
U=rand;
X=ceil(n*U);
end

În cazul repartiţiei geometrice, se ţine cont ı̂n primul rând că dacă U este uniformă pe
[0, 1], atunci 1 − U este de asemenea uniformă pe [0, 1]. Rezultă că, ı̂n urma simulării variabilei
uniforme 1 − U avem două posibilităţi:

1. Funcţia de repartiţie calculată pentru X = 0, F (0) = 1 − ρ este mai mare decât 1 − U .


Acest lucru este echivalent cu ρ < U .
2. Există n ≥ 0 astfel ı̂ncât F (n) = 1 − ρn+1 ≤ 1 − U ≤ F (n + 1) = 1 − ρn+2 . Prin calcule
se deduce că n cu proprietatea de mai sus verifică relaţia n + 1 ≤ lnlnUρ < n + 2.

În al doilea caz de mai sus, rezultă că variabila geometrică este X = b lnlnUρ c − 1 (partea
ı̂ntreagă inferioară minus unu). Aplicând aceeaşi formulă şi ı̂n cazul ρ < U rezultă că valoarea
X obţinută este strict negativă, ceea ce e imposibil. Deci trebuie să considerăm ı̂n acest caz
X = 0. Programul Mathcad este următorul.

genergeom1 (ro) := seed ← 23


U ← rnd (1) 
ln(U )
X ← f loor ln(ro)
−1
X ← 0 if X < 0
return X

Varianta Matlab este următoarea.

5
function X=genergeom1(ro)
rng(’shuffle’);
U=rand;
X=floor(log(U)/log(ro))-1;
if X<0
X=0;
end
end

Pentru variabile aleatoare continue, se scrie ı̂ntâi ı̂nainte de programul Mathcad expre-
sia analitică a inversei funcţiei de repartiţie, depinzând de U şi de lista de parametri. Dacă
repartiţia depinde de un singur parametru, programul Mathcad este următorul.

genercont (teta) := seed ← 23


U ← rnd (1)
X ← F inv (U, teta)
return X

În versiunea Matlab, funcţia F inv (U, teta) se defineşte ulterior funcţiei care generează o
variabilă aleatoare. În exemplul de mai sus, scriem ı̂ntâi

function X=genercont(teta)
rng(’shuffle’);
U=rand;
X=Finv(U,teta);
end

Dacă de exemplu X ∼ exp (λ), avem



 f (x, λ) = λ · e−λ·x , x > 0
F (X, λ) = 1 − e−λ·X = 1 − U, x > 0 . (2)
 −1
F (U, λ) = − lnλU
Deci scriem ı̂nainte de program, sau după, dar ı̂nainte de apelul funcţiei genercont1 (teta)

ln (U )
F inv (U, teta) := −
teta
În Matlab, scriem la sfârşit

function Y=Finv(U,teta)
Y=-log(U)/teta;
end

Dacă X ∼ W eib (ν) (Weibul de parametru ν), avem


ν
ν−1
· e−x , x > 0

 f (x, ν) = ν · x ν
F (X, ν) = 1 − e−X = 1 − U, x > 0 . (3)
 −1 1
F (U, ν) = (− ln U ) ν

6
Deci scriem, analog
1
F inv (U, teta) := (− ln (U )) ν ,

şi versiunea Matlab se scrie analog cazului exp (λ).


Dacă repartiţia depinde de doi parametri, ca de exemplu Cauchy (a, b), F inv are trei para-
metri: U , θ1 şi θ2 . Avem ı̂n acest caz
 b 1
 f (x, a, b) = π · (x−a)2 +b2
F (X, a, b) = π1 arctg X−a
+ π2 = U ,

b
(4)
 −1  1
F (U, a, b) = b · tg π U − 2 + a

deci scriem
  
1
F inv (U, teta1, teta2) := teta2 · tan π · U − + teta1
2

şi versiunea Matlab se scrie analog cazului exp (λ), dar intervin doi parametri.
Există de asemenea repartiţii ce depind de trei parametri. Acestea provin din practică, aşa
cum repartiţia Pareto se utilizează ı̂n hidrologie, pentru debitele şi volumele râurilor. În acest
caz avem
 h i 1 −1
1 a(x−c) a
 f (x, a, b, c) = b 1 − b



h i1 , (5)
a(X−c) a

 F (X, a, b, c) = 1 − 1 − b =1−U

 −1
F (U, a, b, c) = c + ab (1 − U a )

deci scriem

teta2 · (1 − U teta1 )
F inv (U, teta1, teta2, teta3) := teta3 +
teta1

şi versiunea Matlab se scrie analog cazurilor anterioare, dar intervin trei parametri.
O altă metodă generală de simulare este metoda amestecului. Se presupun cunoscute metode
de simulare pentru două variabile aleatoare: Y şi X |Y . Se aplică formulei probabilităţii totale,
care se scrie

X
P (X = i) = P (X = i |Y = j ) · P (Y = j), (6)
j=0

dacă cele două variabile sunt discrete,


Z∞
P (X = i) = P (X = i |y ) · g (y)dy (6’)
0

7
dacă X |Y este discretă şi Y este continuă cu densitatea de repartiţie g

X
f (x) = f (x |Y = j ) · P (Y = j), (6”)
j=0

dacă X |Y este continuă cu densitatea de repartiţie f (x |Y = j ) (şi X are densitatea de


repartiţie f (x)) şi Y este discretă, respectiv
Z∞
f (x) = f (x |y ) · g (y)dy (6”’)
0

dacă ambele variabile sunt continue.


Metoda compunerii constă ı̂n următoarele: se generează ı̂ntâi Y conform repartiţiei, apoi,
ı̂n funcţie de valoarea generată, se generează X |Y . această valoare este valoarea X pe care
ne-am propus s-o generăm.
Un exemplu este repartiţia hiperexponenţială, care este un amestec de n exponenţiale.
În Mathcad, scriem pentru ı̂nceput cum generăm exponenţiala, ı̂n ordinea următoare: funcţia
F inv (U, lambda), apoi funcţia genexp (lambda).
În continuare, se scrie programul Mathcad de generare a unei variabile aleatoare simple
 
λ1 λ2 ... λn
Λ: . (7)
p1 p2 ... pn

gensimpla (n, vx, vp) := seed ← 23


U ← rnd (1)
k←1
S ← vp1
while S < U
k ←k+1
S ← S + vpk
X ← vxk
return X

Acum putem genera repartiţia hiperexponenţială, conform programului Mathcad următor.

genhip (n, vlambda, vp) := seed ← 23


lambda ← gensimpla (n, vlambda, vp)
X ← genexp (lambda)
return X

În Matlab, se scrie ı̂ntâi programul Matlab pentru Λ

8
function X=genhip(n,vlambda,vp)
rng(’shuffle’);
lambda=gensimpla(n,vlambda,vp);
X=genexp(lambda);
end

Apoi se scrie funcţia de generare a unei variabile aleatoare simple

function X=gensimpla(n,vx,vp)
rng(’shuffle’);
U=rand;
k=1;
S=vp(1);
while S<U
k=k+1;
S=S+vp(k);
end;
X=vx(k);
end

În final se scriu ı̂n ordine funcţia de simulare a unei variabile exp (λ), genexp (lambda) prin
metoda inversei, şi funcţia F inv (U, teta) din cazul exponenţialei.
Tot prin metoda compunerii, folosind generarea exponenţialei se simulează variabila Laplace,
care are următoarea densitate de repartiţie:
λ −λ|x|
f (x) = ·e , x ∈ R. (8)
2
Se simulează o variabilă aleatoare exponenţială şi semnul aleator, conform programului
următor.

genlapl (lambda) := seed ← 23


X ← genexp (lambda)
U ← rnd (1)
X ← −X if U > 0.5
return X

Varianta Matlab este următoarea.

function X=genlapl(lambda)
rng(’shuffle’);
U=rand;
X=genexp(lambda);
if U>0.5
X=-X;
end
end

9
Precizăm că genexp (lambda) se defineşte, ca de obicei, ı̂nainte de genlapl (lambda), şi ı̂n
Matlab după.
O altă metodă generală de simulare este metoda respingerii. Prima metodă de respingere
este bazată pe teorema ı̂nfăşurătorii, după cum urmează. Presupunem că dorim să simulăm
variabila aleatoare X cu densitatea de repartiţie f , şi se cunoaşte o metodă de generare a
unei variabile aleatoare Y , având acelaşi suport (acelaşi domeniu ı̂n care cele două densităţi de
repartiţie au valori nenule — deci nu putem face pereche de exemplu Gama de suport [0, ∞) şi
normala de suport R). Presupunem de asemenea că există α > 1 astfel ı̂ncât fg(x) (x)
< α pentru
orice x din suport.
f (Y )
Metoda constă ı̂n generarea succesivă de perechi (Y, U ) până când α·g(Y )
≥ U . Valoarea
1
lui α se interpretează ca probabilitatea ca perechea (Y, U ) să nu fie respinsă (probabilitatea de
acceptare), iar raportul fg(Y
(Y )
)
este privit, dacă are valoare subunitară, ca probabilitatea ca Y să
aibă repartiţia dorită, condiţionată de faptul că perechea (Y, U ) a fost acceptată. Înmulţind
deci cu probabilitatea de acceptare, α1 , obţinem probabilitatea ca Y să fie acceptat ca având
f (Y )
repartiţia căutată, şi anume cu densitatea de repartiţie f . Această valoare este chiar α·g(Y )
de mai sus, şi trebuie să fie suficient de mare pentru ca metoda să fie corectă. Alegerea
ca această valoare să fie mai mare sau egală cu U trebuie privită prin analogie cu aplicarea
metodei inverse ı̂n cazul repartiţiilor discrete, când se alege ı̂n fiecare caz prima valoare pentru
care suma probabilităţilor este mai mare sau egală cu valoarea uniformă U generată iniţial.
Evident, raportul poate fi şi supraunitar, dar ı̂nmulţit cu α1 este tot subunitar, ţinând cont că
α a fost ales astfel ı̂ncât să fie mai mare sau egal cu acest raport. Dacă notăm cu ρ = 1 − α1
probabilitatea de respingere, rezultă că numărul de respingeri este N ∼ Geom (ρ).
Un exemplu de aplicare a primei metode de respingere este cazul repartiţiei Γ (a, 1) cu a < 1.
Considerăm Y ∼ W eib (a), adică repartiţia Weibul prezentată anterior. Prin calcule rezultă
a
f (x) ex −x
= . (9)
g (x) Γ (a + 1)
1
Prin derivare, maximul exponentului se obţine pentru x0 = a 1−a , deci
a
1−a
ea (1−a)
α= . (9’)
Γ (a + 1)
Deoarece Γ (a + 1) apare la numitor atât ı̂n (9) cât şi ı̂n (90 ), se poate considera α =
a
a
e , şi fg(x)
a 1−a (1−a) (x)
se ı̂nlocuieşte cu ex −x . Evident, α1 ı̂şi pierde interpretarea de probabilitate.
Programul Mathcad este următorul.

genweib (a) := seed ← 23


U ← rnd (1)
1
X ← (− ln (U )) a
return X

10
gengama1 (a) := seed ← 23
a
alf a ← ea ·(1−a)
1−a

r ← −1
U ←1
while r < U
U ← rnd (1)
Y ← genweib (a)
Y a −Y
r ← e alf a
X←Y
return X

În versiunea Matlab, scriem pentru ı̂nceput

function X=gengama1(a)
rng(’shuffle’);
alfa=exp(a^(a/(1-a))*(1-a));
r=-1;
U=1;
while r<U
U=rand;
Y=genweib(a);
r=exp(Y^a-Y)/alfa;
end
X=Y;
end

În final, scriem funcţia care simulează o variabilă aleatoare Weibul.

function X=genweib(a)
rng(’shuffle’);
U=rand;
X=(-log(U))^(1/a);
end

Pentru al doilea procedeu de respingere se presupun cunoscute metode de generare ale


variabilelor aleatoare Y cu funcţia de repartiţie Q şi Z cu densitatea de repartiţie r, şi variabila
aleatoare X are funcţia de repartiţie
Zx
F (x) = c · Q (φ (x)) r (x)dx, (10)
−∞

unde funcţia φ ia valori ı̂n intervalul [0, M ].


Metoda constă ı̂n generarea succesivă de perechi Y şi Z până când Z ≤ φ (Y ). Probabilitatea
de acceptare este 1c . Interpretarea acestei metode se reduce la interpretarea primului procedeu
de respingere, ţinându–se cont că dacă φ este strict crescătoare, avem P (Y ≤ α) = Q (α), de

11
unde deducem că pentru variabila aleatoare φ (Y ) avem P (φ (Y ) ≤ a) = P (Y ≤ φ−1 (a)) =
Q (φ−1 (a)). Deci problema se reduce de la Y şi Z la φ (Y ) şi Z. Dacă φ este descrescătoare, se
ţine cont că dacă U este uniformă pe [0, 1], atunci 1 − U este uniformă pe [0, 1] (analog cazurilor
simulării variabilelor aleatoare exponenţiale şi Weibul prin metoda inversei).
De exemplu generăm variabila aleatoare cu densitate de repartiţie

F (x) = c 1 − e−λ·x e−µ·x ,




cu c = λ+µλ
.
În Mathcad se defineşte ı̂ntâi funcţia genexp (lambda), care generează X ∼ exp (λ), apoi
repartiţia dublu exponenţială, după cum urmează.

genexpd (lambda, miu) := seed ← 23


Y ←0
Z←1
while Y < Z
Y ← genexp (miu)
Z ← genexp (lambda)
X←Y
return X

Varianta Matlab a funcţiei de mai sus este următoarea.

function X=genexpd(lambda,miu)
rng(’shuffle’);
Y=0;
Z=1;
while Y<Z
Y=genexp(miu);
Z=genexp(lambda);
end
X=Y;
end

Apoi se scrie funcţia de generare a lui X ∼ exp (λ).


O altă variabilă aleatoare care poate fi simulată prin al doilea procedeu de respingere este
variabila cu repartiţia Γ (a) trunchiată la stânga ı̂n 1. Densitatea de repartiţie este
 xa−1 e−x
p2
, x>1
f2 (x) = . (11)
0, in rest
R∞
unde p2 = xa−1 e−x dx. Pentru acest lucru considerăm
1

1 − xa−1 , pentru x ≥ 1
Q (x) = , si (12)
0 in rest

12

e1−x , pentru x ≥ 1
r (x) = . (12’)
0 in rest
1
Programul Mathcad este următorul, pentru b = − 1−a .

gengamatrst (b) := seed ← 47


Y ←1
Z←0
while Y > Z
U ← rnd (1)
V ← rnd (1)
Y ← 1 − ln (V )
Z ← Ub
X←Y
return X

Versiunea Matlab a programului de mai sus este

function X=gengamatrst(b)
rng(’shuffle’);
Y=1;
Z=0;
while Y>Z
U=rand;
V=rand;
Y=1-log(V);
Z=U^b;
end
end

Al treilea procedeu de respingere simulează o variabilă aleatoare X cu funcţia de repartiţie


Zx
1
F (x) = e−G(t) · g0 (t)dt, (13)
pa
−∞

unde G este funcţia de repartiţie a unei variabile aleatoare continue, şi g0 este densitatea de
repartiţie a unei variabile aleatoare continue (posibil aceeaşi, posibil diferită). Din lim F (x) =
x→∞
1, rezultă
Z∞
pa = e−G(x) · g0 (x)dx. (13’)
−∞

Metoda a treia de respingere constă ı̂n următoarele.

1. Se simulează Z0 cu densitatea de repartiţie g0 , şi Z1 cu funcţia de repartiţie G.

13
2. Dacă Z0 < Z1 ne oprim considerând k = 1. Altfel generăm ı̂n continuare Zi cu funcţia
de repartiţie G, adică până când Z0 ≥ Z1 ≥ ... ≥ Zk−1 < Zk .

3. Pentru k impar, ne oprim cu X = Z0 . Altfel continuam cu generarea şirurilor de mai sus,


până când k devine impar.

Interpretarea acestei metode este legată de repartiţiile Poisson şi exponenţială. Vom vedea
ı̂n secţiunile următoare că aceste repartiţii sunt legate. Condiţia de a ne opri când k este
impar rezultă din monotonia probabilităţilor pentru repartiţia Poisson (iniţial crescătoare, apoi
descrescătoare), şi din faptul că se poate demonstra că

(G (x))k−1
P (x ≥ Z1 ≥ ... ≥ Zk−1 ) = . (14)
(k − 1)!
Tocmai de aici rezultă legătura cu repartiţia Poisson, şi k par conduce la ambiguitatea
existenţei a două numere cel mai probabile. Se demonstrează prin calcul că pa din (13) şi (130 )
este de fapt probabilitatea de a ne opri (probabilitatea de acceptare).
Prezentăm ı̂n continuare cazul ı̂n care Z0 şi Zi , i > 0 sunt uniforme pe [0, 1]. Rezultă,
aplicând (13)

 0, daca x < 0
1−e−x
F (x) = , daca 0 ≤ x ≤ 1 . (15)
 1−e−1
1, daca x > 1
Deci repartiţia este exp (1) trunchiată la dreapta ı̂n 1. Programul Mathcad este următorul.

genexptrunc (p) := seed ← 23


k←0
while mod (k, 2) =0
k←1
Z0 ← rnd (1)
Zcrt ← Z0
Z ← rnd (1)
while Z ≤ Zcrt
k ←k+1
Zcrt ← Z
Z ← rnd (1)
X ← Z0
return X

Varianta Matlab a funcţiei de mai sus este după cum urmează.

function X=genexptrunc()
rng(’shuffle’);
k=0;
while mod(k,2)==0
k=1;

14
Z0=rand;
Zcrt=Z0;
Z=rand;
while Z<=Zcrt
k=k+1;
Zcrt=Z;
Z=rand;
end
X=Z0;
end

Dacă ı̂n programul ”genexptrunc” de mai zus considerăm Z0 = U a cu 0 < a < 1 cu U


uniformă pe [0, 1] ı̂n loc de Z0 uniformă pe [0, 1], obţinem repartiţia Γ (a) trunchiată la dreapta
ı̂n 1. Densitatea de repartiţie este
 xa−1 e−x
p1
, x<1
f1 (x) = , (16)
0, in rest
R1
unde p1 = xa−1 e−x dx.
0
Programul Mathcad este următorul.

gengamatrdr (a) := seed ← 23


k←0
while mod (k, 2) =0
k←1
U ← rnd (1)
Z0 ← U a
Zcrt ← Z0
Z ← rnd (1)
while Z ≤ Zcrt
k ←k+1
Zcrt ← Z
Z ← rnd (1)
X ← Z0
return X

Varianta Matlab a funcţiei de mai sus este după cum urmează.

function X=gengamatrdr(a)
rng(’shuffle’);
k=0;
while mod(k,2)==0
k=1;
U=rand;
Z0=U^a;

15
Zcrt=Z0;
Z=rand;
while Z<=Zcrt
k=k+1;
Zcrt=Z;
Z=rand;
end
X=Z0;
end

Prezentăm ı̂n continuare o metodă de compunere-respingere pentru Γ (a, 1) cu a < 1. Ţinem


cont că densitatea de repartiţie este

f (x) = p1 · f1 (x) + p2 · f2 (x) (17)


În Mathcad programul este următorul.

gengamacr (a) := seed ← 37


p2 ← Γ(a,1)
Γ(a)
p1 = 1 − p2
U ← rand (1)
X ← gengamatrdr a1 if U ≤ p1

1
X ← gengamatrst − 1−a otherwise
return X

Versiunea Matlab a programului de mai sus este

function X=gengamacr(a)
rng(’shuffle’);
U=rand;
if U<=gammainc(1,a)
X=gengamatrdr(1/a);
else
X=gengamatrst(-1/(1-a));
end
end

16