package umontreal.iro.lecuyer.randvar;
import umontreal.iro.lecuyer.rng.*;
import umontreal.iro.lecuyer.probdist.*;
/**
* This class implements noncentral chi square random variate generators
* using the additive property of the noncentral chi square distribution. It uses the following algorithm: generate a real
*
* X∼N((λ)1/2, 1) from a normal distribution with variance 1,
* generate a real
* Y∼Γ((ν - 1)/2, 1/2) from a gamma distribution,
* then return X2 + Y. Here ν is the number of degrees of freedom and
* λ is the noncentrality parameter.
*
*
* To generate the normal variates, one uses the fast
* acceptance-complement ratio method in
* (see class {@link umontreal.iro.lecuyer.randvar.NormalACRGen NormalACRGen}).
* To generate the gamma variates, one uses acceptance-rejection for α < 1,
* and acceptance-complement for
* α >= 1, as proposed in
* (see class {@link umontreal.iro.lecuyer.randvar.GammaAcceptanceRejectionGen GammaAcceptanceRejectionGen}).
*
*
* This noncentral chi square generator is faster than the generator
* {@link umontreal.iro.lecuyer.randvar.ChiSquareNoncentralPoisGen ChiSquareNoncentralPoisGen} .
* For small λ, it is nearly twice as fast. As λ increases,
* it is still faster but not as much.
*
*/
public class ChiSquareNoncentralGamGen extends ChiSquareNoncentralGen {
private double racLam = -1.0;
/**
* Creates a noncentral chi square random variate generator with
* with ν = nu degrees of freedom and noncentrality parameter
* λ = lambda using stream stream, as described above.
*
*/
public ChiSquareNoncentralGamGen (RandomStream stream,
double nu, double lambda) {
super (stream, null);
setParams (nu, lambda);
racLam = Math.sqrt(lambda);
}
public double nextDouble() {
return gamGen (stream, nu, racLam);
}
/**
* Generates a variate from the noncentral chi square
* distribution with parameters ν = nu and λ = lambda using stream stream, as described above.
*
*/
public static double nextDouble (RandomStream stream,
double nu, double lambda) {
double racLam = Math.sqrt(lambda);
return gamGen (stream, nu, racLam);
}
//>>>>>>>>>>>>>>>>>>>> P R I V A T E M E T H O D S <<<<<<<<<<<<<<<<<<<<
private static double gamGen (RandomStream s, double nu, double racLam) {
// racLam = sqrt(lambda)
double x = NormalACRGen.nextDouble (s, racLam, 1.0);
double y = GammaAcceptanceRejectionGen.nextDouble(s, 0.5*(nu - 1.0), 0.5);
return x*x + y;
}
}
Ads help maintain this website.