Answer: Box-Muller transform!

http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform

Source snippet:

class NormalRandom

{

private bool haveNextRandom = false;

private double nextRandom = 0;

private Random rnd = new Random();

/// <summary>

/// Implements random number generator with normal distribution

/// Implements random number generator with normal distribution

/// based on the polar form of Box-Muller transform.

/// </summary>

/// <returns>A random number with normal distribution.</returns>

/// <returns>

public double NextDouble()

{

if (haveNextRandom)

{

haveNextRandom = false;

return nextRandom;

}

double x1, x2, w;

do

{

x1 = 2.0 * rnd.NextDouble() - 1.0;

x2 = 2.0 * rnd.NextDouble() - 1.0;

w = x1 * x1 + x2 * x2;

} while (w >= 1.0);

w = Math.Sqrt((-2.0 * Math.Log(w)) / w);

nextRandom = x2 * w;

haveNextRandom = true;

return x1 * w;

}

}

## 1 comment:

There is another method, but less accurate. If you don't know about Box-Muller transformation you can use Central limit theorem and add about 12 random numbers and then divide them by their standard deviation.

Post a Comment