Source
double random_gaussian({num mean = 0.0, num stdev = 1.0}) { double u1 = 0.0; double u2 = 0.0; double w = 0.0; m.Random r = new m.Random(); do { u1 = 2 * r.nextDouble() - 1; u2 = 2 * r.nextDouble() - 1; w = u1 * u1 + u2 * u2; } while (w >= 1); w = m.sqrt((-2.0 * m.log(w)) / w); return mean + (u2 * w) * stdev; }