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
 * @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;
		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;