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