public double Normal()
{
lock (this.valueNormalLock) {
if (this.valueHaveLastNormal) {
this.valueHaveLastNormal = false;
return this.valueLastNormal;
}
}
double x = this.NonZeroUniform();
double y = this.Uniform();
double s = Math.Sqrt(-2 * Math.Log(x));
double t = 2 * Math.PI * y;
double otherNormal = s * Math.Sin(t);
lock (this.valueNormalLock) {
this.valueLastNormal = otherNormal;
this.valueHaveLastNormal = true;
}
return s * Math.Cos(t);
}