Kaydet (Commit) 72c2e1b5 authored tarafından Guido van Rossum's avatar Guido van Rossum

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.
üst 9824509d
...@@ -182,12 +182,13 @@ def gauss(mu, sigma): ...@@ -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): ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment