Marsaglia Transform: Uniform to Standard Normal

The polar method (attributed to George Marsaglia, 1964) is a pseudo-random number sampling method for generating a pair of independent standard normal random variables. While it is superior to the Box–Muller transform, the Ziggurat algorithm is even more efficient. – Wikipedia

This post by Hristo Dachev on the Marsaglia transform sent me down a long road of learning for which I am truly grateful. I learnt about estimating statistics on streaming observations, the Park Miller random number generator, the value of descriptive statistics and maintaining a sorted array. Additionally I ended up creating a histographer (poorly performing in comparison to Hristos) which I then used to visualise the output of the Marsaglia transform.

The code

/**
 * Marsaglia transform
 * http://en.wikipedia.org/wiki/Marsaglia_polar_method
 * http://blog.controul.com/2009/04/standard-normal-distribution-in-as3/
 * @return A number from the standard normal distribution
 */
private var useCache:Boolean = true;
private var cache:Number = 0;
final public function stdNormal():Number
{
	useCache = !useCache;
	if (useCache)
		return cache;

	var x:Number, y:Number, w:Number;
	do 
	{
		x = float( -1, 1);
		y = float( -1, 1);
		w = x * x + y * y;
	}
	while (w >= 1 || w == 0);

	w = Math.sqrt( -2 * Math.log(w) / w);
	cache = x * w;
	return y * w;
}