package umontreal.iro.lecuyer.randvar;
import umontreal.iro.lecuyer.rng.*;
import umontreal.iro.lecuyer.probdist.*;
/**
* This class implements methods for generating random variates from the
* Student distribution with n > 0 degrees of freedom.
* Its density function is
*
*
*
* f (x) = [Γ((n + 1)/2)/(Γ(n/2)(πn)1/2)][1 + x2/n]-(n+1)/2 for - ∞ < x < ∞,
*
* where
* Γ(x) is the gamma function defined in
* {@link GammaGen}.
*
*
* The nextDouble method simply calls inverseF on the
* distribution.
*
*
* The following table gives the CPU time needed to generate 107 Student
* random variates using the different implementations available in SSJ.
* The second test (Q) was made with the inverse in
* {@link StudentDistQuick},
* while the first test was made with the inverse in {@link StudentDist}.
* These tests were made on a machine with processor AMD Athlon 4000, running
* Red Hat Linux, with clock speed at 2400 MHz.
*
*
*
*
* Generator
* time in seconds
*
* StudentGen
* 22.4
*
* StudentGen(Q)
* 6.5
*
* StudentPolarGen
* 1.4
*
*
*
*
*/
public class StudentGen extends RandomVariateGen {
protected int n = -1;
/**
* Creates a Student random variate generator with
* n degrees of freedom, using stream s.
*
*/
public StudentGen (RandomStream s, int n) {
super (s, new StudentDist(n));
setN (n);
}
/**
* Creates a new generator for the Student distribution dist
* and stream s.
*
*/
public StudentGen (RandomStream s, StudentDist dist) {
super (s, dist);
if (dist != null)
setN (dist.getN ());
}
/**
* Generates a new variate from the Student distribution
* with n = n degrees of freedom, using stream s.
*
*/
public static double nextDouble (RandomStream s, int n) {
return StudentDist.inverseF (n, s.nextDouble());
}
/**
* Returns the value of n for this object.
*
*
*/
public int getN() {
return n;
}
protected void setN (int nu) {
if (nu <= 0)
throw new IllegalArgumentException ("n <= 0");
this.n = nu;
}
}
Ads help maintain this website.