Fixed a bug in the gauss() function. The bug was reported by Mike

Miller, who complained that its kurtosis was bad, and then fixed by
Lambert Meertens (author of the original algorithm) who discovered
that the mathematical analysis leading to his solution was wrong, and
provided a corrected version.  Mike then tested the fix and reported
that the kurtosis was now good.
This commit is contained in:
Guido van Rossum 1998-02-19 21:17:42 +00:00
parent 9824509d3e
commit 72c2e1b56e

View file

@ -182,12 +182,13 @@ def gauss(mu, sigma):
# When x and y are two variables from [0, 1), uniformly
# distributed, then
#
# cos(2*pi*x)*log(1-y)
# sin(2*pi*x)*log(1-y)
# cos(2*pi*x)*sqrt(-2*log(1-y))
# sin(2*pi*x)*sqrt(-2*log(1-y))
#
# are two *independent* variables with normal distribution
# (mu = 0, sigma = 1).
# (Lambert Meertens)
# (corrected version; bug discovered by Mike Miller, fixed by LM)
global gauss_next
@ -196,9 +197,9 @@ def gauss(mu, sigma):
gauss_next = None
else:
x2pi = random() * TWOPI
log1_y = log(1.0 - random())
z = cos(x2pi) * log1_y
gauss_next = sin(x2pi) * log1_y
g2rad = sqrt(-2.0 * log(1.0 - random()))
z = cos(x2pi) * g2rad
gauss_next = sin(x2pi) * g2rad
return mu + z*sigma