package umontreal.iro.lecuyer.randvar;
import umontreal.iro.lecuyer.rng.*;
import umontreal.iro.lecuyer.probdist.*;


/**
 * This class implements Erlang random variate generators using
 * the convolution method.  This method uses inversion to
 * generate k exponential variates with parameter λ and returns
 * their sum.
 * 
 */
public class ErlangConvolutionGen extends ErlangGen  {


   /**
    * Creates an Erlang random variate generator with parameters
    *  k and λ = lambda,
    *   using stream s.
    * 
    */
   public ErlangConvolutionGen (RandomStream s, int k, double lambda)  {
      super (s, null);
      setParams (k, lambda);
   }


   /**
    * Creates an Erlang random variate generator with parameters
    *  k and 
    * λ = 1, using stream s.
    * 
    */
   public ErlangConvolutionGen (RandomStream s, int k)  {
      this (s, k, 1.0);
   }

 
   /**
    * Creates a new generator for the distribution dist
    *     and stream s.
    * 
    */
   public ErlangConvolutionGen (RandomStream s, ErlangDist dist)  {
      super (s, dist);
      if (dist != null)
         setParams (dist.getK(), dist.getLambda());
   }
 

   public double nextDouble() {
      return convolution (stream, k, lambda);
   }

   public static double nextDouble (RandomStream s, int k, double lambda) {
      return convolution (s, k, lambda);
   }

   private static double convolution (RandomStream s, int k, double lambda) {
      double x = 0.0;
      for (int i=0;  i 

Ads help maintain this website.