mirror of https://github.com/python/cpython
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:
parent
9824509d3e
commit
72c2e1b56e
|
@ -182,12 +182,13 @@ def gauss(mu, sigma):
|
||||||
# When x and y are two variables from [0, 1), uniformly
|
# When x and y are two variables from [0, 1), uniformly
|
||||||
# distributed, then
|
# distributed, then
|
||||||
#
|
#
|
||||||
# cos(2*pi*x)*log(1-y)
|
# cos(2*pi*x)*sqrt(-2*log(1-y))
|
||||||
# sin(2*pi*x)*log(1-y)
|
# sin(2*pi*x)*sqrt(-2*log(1-y))
|
||||||
#
|
#
|
||||||
# are two *independent* variables with normal distribution
|
# are two *independent* variables with normal distribution
|
||||||
# (mu = 0, sigma = 1).
|
# (mu = 0, sigma = 1).
|
||||||
# (Lambert Meertens)
|
# (Lambert Meertens)
|
||||||
|
# (corrected version; bug discovered by Mike Miller, fixed by LM)
|
||||||
|
|
||||||
global gauss_next
|
global gauss_next
|
||||||
|
|
||||||
|
@ -196,9 +197,9 @@ def gauss(mu, sigma):
|
||||||
gauss_next = None
|
gauss_next = None
|
||||||
else:
|
else:
|
||||||
x2pi = random() * TWOPI
|
x2pi = random() * TWOPI
|
||||||
log1_y = log(1.0 - random())
|
g2rad = sqrt(-2.0 * log(1.0 - random()))
|
||||||
z = cos(x2pi) * log1_y
|
z = cos(x2pi) * g2rad
|
||||||
gauss_next = sin(x2pi) * log1_y
|
gauss_next = sin(x2pi) * g2rad
|
||||||
|
|
||||||
return mu + z*sigma
|
return mu + z*sigma
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue