public double nextDouble(double alpha,double lambda){
  double a=alpha;
  double aa=-1.0, aaa=-1.0, b=0.0, c=0.0, d=0.0, e, r, s=0.0, si=0.0, ss=0.0, q0=0.0, q1=0.0416666664, q2=0.0208333723, q3=0.0079849875, q4=0.0015746717, q5=-0.0003349403, q6=0.0003340332, q7=0.0006053049, q8=-0.0004701849, q9=0.0001710320, a1=0.333333333, a2=-0.249999949, a3=0.199999867, a4=-0.166677482, a5=0.142873973, a6=-0.124385581, a7=0.110368310, a8=-0.112750886, a9=0.104089866, e1=1.000000000, e2=0.499999994, e3=0.166666848, e4=0.041664508, e5=0.008345522, e6=0.001353826, e7=0.000247453;
  double gds, p, q, t, sign_u, u, v, w, x;
  double v1, v2, v12;
  if (a <= 0.0)   throw new IllegalArgumentException();
  if (lambda <= 0.0)   new IllegalArgumentException();
  if (a < 1.0) {
    b=1.0 + 0.36788794412 * a;
    for (; ; ) {
      p=b * randomGenerator.raw();
      if (p <= 1.0) {
        gds=Math.exp(Math.log(p) / a);
        if (Math.log(randomGenerator.raw()) <= -gds)         return (gds / lambda);
      }
 else {
        gds=-Math.log((b - p) / a);
        if (Math.log(randomGenerator.raw()) <= ((a - 1.0) * Math.log(gds)))         return (gds / lambda);
      }
    }
  }
 else {
    if (a != aa) {
      aa=a;
      ss=a - 0.5;
      s=Math.sqrt(ss);
      d=5.656854249 - 12.0 * s;
    }
    do {
      v1=2.0 * randomGenerator.raw() - 1.0;
      v2=2.0 * randomGenerator.raw() - 1.0;
      v12=v1 * v1 + v2 * v2;
    }
 while (v12 > 1.0);
    t=v1 * Math.sqrt(-2.0 * Math.log(v12) / v12);
    x=s + 0.5 * t;
    gds=x * x;
    if (t >= 0.0)     return (gds / lambda);
    u=randomGenerator.raw();
    if (d * u <= t * t * t)     return (gds / lambda);
    if (a != aaa) {
      aaa=a;
      r=1.0 / a;
      q0=((((((((q9 * r + q8) * r + q7) * r + q6) * r + q5) * r + q4) * r + q3) * r + q2) * r + q1) * r;
      if (a > 3.686) {
        if (a > 13.022) {
          b=1.77;
          si=0.75;
          c=0.1515 / s;
        }
 else {
          b=1.654 + 0.0076 * ss;
          si=1.68 / s + 0.275;
          c=0.062 / s + 0.024;
        }
      }
 else {
        b=0.463 + s - 0.178 * ss;
        si=1.235;
        c=0.195 / s - 0.079 + 0.016 * s;
      }
    }
    if (x > 0.0) {
      v=t / (s + s);
      if (Math.abs(v) > 0.25) {
        q=q0 - s * t + 0.25 * t * t + (ss + ss) * Math.log(1.0 + v);
      }
 else {
        q=q0 + 0.5 * t * t* ((((((((a9 * v + a8) * v + a7) * v + a6) * v + a5) * v + a4) * v + a3) * v + a2) * v + a1)* v;
      }
      if (Math.log(1.0 - u) <= q)       return (gds / lambda);
    }
    for (; ; ) {
      do {
        e=-Math.log(randomGenerator.raw());
        u=randomGenerator.raw();
        u=u + u - 1.0;
        sign_u=(u > 0) ? 1.0 : -1.0;
        t=b + (e * si) * sign_u;
      }
 while (t <= -0.71874483771719);
      v=t / (s + s);
      if (Math.abs(v) > 0.25) {
        q=q0 - s * t + 0.25 * t * t + (ss + ss) * Math.log(1.0 + v);
      }
 else {
        q=q0 + 0.5 * t * t* ((((((((a9 * v + a8) * v + a7) * v + a6) * v + a5) * v + a4) * v + a3) * v + a2) * v + a1)* v;
      }
      if (q <= 0.0)       continue;
      if (q > 0.5) {
        w=Math.exp(q) - 1.0;
      }
 else {
        w=((((((e7 * q + e6) * q + e5) * q + e4) * q + e3) * q + e2) * q + e1) * q;
      }
      if (c * u * sign_u <= w * Math.exp(e - 0.5 * t * t)) {
        x=s + 0.5 * t;
        return (x * x / lambda);
      }
    }
  }
}

public double nextDouble ( double alpha , double lambda ) { double a = alpha ; double aa = - 1.0 , aaa = - 1.0 , b = 0.0 , c = 0.0 , d = 0.0 , e , r , s = 0.0 , si = 0.0 , ss = 0.0 , q0 = 0.0 , q1 = 0.0416666664 , q2 = 0.0208333723 , q3 = 0.0079849875 , q4 = 0.0015746717 , q5 = - 0.0003349403 , q6 = 0.0003340332 , q7 = 0.0006053049 , q8 = - 0.0004701849 , q9 = 0.0001710320 , a1 = 0.333333333 , a2 = - 0.249999949 , a3 = 0.199999867 , a4 = - 0.166677482 , a5 = 0.142873973 , a6 = - 0.124385581 , a7 = 0.110368310 , a8 = - 0.112750886 , a9 = 0.104089866 , e1 = 1.000000000 , e2 = 0.499999994 , e3 = 0.166666848 , e4 = 0.041664508 , e5 = 0.008345522 , e6 = 0.001353826 , e7 = 0.000247453 ; double gds , p , q , t , sign_u , u , v , w , x ; double v1 , v2 , v12 ; if ( a <= 0.0 ) throw new IllegalArgumentException ( ) ; if ( lambda <= 0.0 ) new IllegalArgumentException ( ) ; if ( a < 1.0 ) { b = 1.0 + 0.36788794412 * a ; for ( ; ; ) { p = b * randomGenerator . raw ( ) ; if ( p <= 1.0 ) { gds = Math . exp ( Math . log ( p ) / a ) ; if ( Math . log ( randomGenerator . raw ( ) ) <= - gds ) return ( gds / lambda ) ; } else { gds = - Math . log ( ( b - p ) / a ) ; if ( Math . log ( randomGenerator . raw ( ) ) <= ( ( a - 1.0 ) * Math . log ( gds ) ) ) return ( gds / lambda ) ; } } } else { if ( a != aa ) { aa = a ; ss = a - 0.5 ; s = Math . sqrt ( ss ) ; d = 5.656854249 - 12.0 * s ; } do { v1 = 2.0 * randomGenerator . raw ( ) - 1.0 ; v2 = 2.0 * randomGenerator . raw ( ) - 1.0 ; v12 = v1 * v1 + v2 * v2 ; } while ( v12 > 1.0 ) ; t = v1 * Math . sqrt ( - 2.0 * Math . log ( v12 ) / v12 ) ; x = s + 0.5 * t ; gds = x * x ; if ( t >= 0.0 ) return ( gds / lambda ) ; u = randomGenerator . raw ( ) ; if ( d * u <= t * t * t ) return ( gds / lambda ) ; if ( a != aaa ) { aaa = a ; r = 1.0 / a ; q0 = ( ( ( ( ( ( ( ( q9 * r + q8 ) * r + q7 ) * r + q6 ) * r + q5 ) * r + q4 ) * r + q3 ) * r + q2 ) * r + q1 ) * r ; if ( a > 3.686 ) { if ( a > 13.022 ) { b = 1.77 ; si = 0.75 ; c = 0.1515 / s ; } else { b = 1.654 + 0.0076 * ss ; si = 1.68 / s + 0.275 ; c = 0.062 / s + 0.024 ; } } else { b = 0.463 + s - 0.178 * ss ; si = 1.235 ; c = 0.195 / s - 0.079 + 0.016 * s ; } } if ( x > 0.0 ) { v = t / ( s + s ) ; if ( Math . abs ( v ) > 0.25 ) { q = q0 - s * t + 0.25 * t * t + ( ss + ss ) * Math . log ( 1.0 + v ) ; } else { q = q0 + 0.5 * t * t * ( ( ( ( ( ( ( ( a9 * v + a8 ) * v + a7 ) * v + a6 ) * v + a5 ) * v + a4 ) * v + a3 ) * v + a2 ) * v + a1 ) * v ; } if ( Math . log ( 1.0 - u ) <= q ) return ( gds / lambda ) ; } for ( ; ; ) { do { e = - Math . log ( randomGenerator . raw ( ) ) ; u = randomGenerator . raw ( ) ; u = u + u - 1.0 ; sign_u = ( u > 0 ) ? 1.0 : - 1.0 ; t = b + ( e * si ) * sign_u ; } while ( t <= - 0.71874483771719 ) ; v = t / ( s + s ) ; if ( Math . abs ( v ) > 0.25 ) { q = q0 - s * t + 0.25 * t * t + ( ss + ss ) * Math . log ( 1.0 + v ) ; } else { q = q0 + 0.5 * t * t * ( ( ( ( ( ( ( ( a9 * v + a8 ) * v + a7 ) * v + a6 ) * v + a5 ) * v + a4 ) * v + a3 ) * v + a2 ) * v + a1 ) * v ; } if ( q <= 0.0 ) continue ; if ( q > 0.5 ) { w = Math . exp ( q ) - 1.0 ; } else { w = ( ( ( ( ( ( e7 * q + e6 ) * q + e5 ) * q + e4 ) * q + e3 ) * q + e2 ) * q + e1 ) * q ; } if ( c * u * sign_u <= w * Math . exp ( e - 0.5 * t * t ) ) { x = s + 0.5 * t ; return ( x * x / lambda ) ; } } } }
returns a random number from the distribution ; bypasses the internal state .
