package COM.furryandfrisky.util;
import java.util.Random;
/**
* A final, non synchronized random number generator. Provides a quick Gaussian
* generator.
*/
public final class FastRandom extends Random
{
/**
* Create a random generator with a random seed.
*/
public FastRandom()
{
}
/**
* Create a random generator starting with the given seed.
*
* @param seed the initial seed value
*/
public FastRandom( long seed )
{
super( seed );
}
private double nextNextGaussian;
private boolean haveNextNextGaussian = false;
/**
* Overrides Random.nextGaussian to do faster calculation.
*/
public double nextGaussian()
{
if (haveNextNextGaussian)
{ haveNextNextGaussian = false;
return nextNextGaussian;
}
else
{
double v1, v2, s;
do
{
// less calls into nextDouble() means less calls into next(...)
//v1 = 2 * nextDouble() - 1; // between -1 and 1
//v2 = 2 * nextDouble() - 1; // between -1 and 1
v1 = nextInt() / (0.0 + Integer.MIN_VALUE);
v2 = nextInt() / (0.0 + Integer.MIN_VALUE);
s = v1 * v1 + v2 * v2;
}
while (s >= 1);
double multiplier = Math.sqrt(-2 * Math.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1 * multiplier;
}
}
}