package java.util;
/**
* Pseudo-random number generation.
*/
public class Random
{
private int iPrevSeed, iSeed;
private boolean haveNextNextGaussian;
private double nextNextGaussian;
public Random (long seed)
{
iPrevSeed = 1;
iSeed = (int) seed;
}
public Random()
{
this(System.currentTimeMillis());
}
/**
* @return A random positive or negative integer.
*/
public int nextInt()
{
int pNewSeed = (iSeed * 48271) ^ iPrevSeed;
iPrevSeed = iSeed;
iSeed = pNewSeed;
return pNewSeed;
}
/**
* Returns a random integer in the range 0...n-1.
* @param n the bound
* @return A random integer in the range 0...n-1.
*/
public int nextInt (int n)
{
int m = nextInt() % n;
return m >= 0 ? m : m + n;
}
/**
* Returns a random boolean in the range 0-1.
* @return A random boolean in the range 0-1.
*/
public boolean nextBoolean(){
boolean nextBoolean;
int nextInt = this.nextInt(2);
if(nextInt == 1){
nextBoolean = true;
}else{
nextBoolean = false;
}
return nextBoolean;
}
public double nextDouble(){
return Math.random();
}
/**
* Returns the next pseudorandom, Gaussian ("normally") distributed double value with mean 0.0 and standard deviation 1.0 from this random number generator's sequence.
* @return Returns the next pseudorandom, Gaussian ("normally") distributed double value
*/
public double nextGaussian(){
//http://java.sun.com/j2se/1.4.2/docs/api/java/util/Random.html#nextGaussian()
if (haveNextNextGaussian) {
haveNextNextGaussian = false;
return nextNextGaussian;
} else {
double v1, v2, s;
do {
v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0
v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
double multiplier = Math.sqrt(-2 * Math.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1 * multiplier;
}
}
}