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;
        }
    }
}
1
Hosted by www.Geocities.ws