if a gt 1;
x = rg2(a);
elseif a lt 1;
a = a + 1;
u = rndu(1,1);
x = rg2(a)*u^(1/a);
elseif a == 1;
x = -ln(rndu(1,1));
endif;
retp(x);
endp;
proc rg2(a);
local gam,accept,b,c,j,x,z,u,v,w,y;
b = a-1;
c = 3*a - .75;
accept = 0;
do while accept == 0;
u = rndu(1,1);
v = rndu(1,1);
w = u*(1-u);
y = sqrt(c/w)*(u-.5);
x = b+y;
if x ge 0;
z = 64*(w^3)*(v^2);
accept = z le ( 1-(2*y^2)/x );
if accept == 0;
accept = ln(z) le 2*(b*ln(x/b) - y);
endif;
endif;
endo;