public double Next()
{
// check if we can use second value
if (useSecond)
{
// return the second number
useSecond = false;
return secondValue;
}
double x1, x2, w, firstValue;
// generate new numbers
do
{
x1 = rand.Next()*2.0 - 1.0;
x2 = rand.Next()*2.0 - 1.0;
w = x1*x1 + x2*x2;
} while (w >= 1.0);
w = System.Math.Sqrt((-2.0*System.Math.Log(w))/w);
// get two standard random numbers
firstValue = x1*w;
secondValue = x2*w;
useSecond = true;
// return the first number
return firstValue;
}