]> granicus.if.org Git - python/commitdiff
Fixed a bug in the gauss() function. The bug was reported by Mike
authorGuido van Rossum <guido@python.org>
Thu, 19 Feb 1998 21:17:42 +0000 (21:17 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 19 Feb 1998 21:17:42 +0000 (21:17 +0000)
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.

Lib/random.py

index ebab1f80f9ebb960f81b087717fd0f5de308c4bb..49921cb8b343172787fc61815b2c14a03c48c222 100644 (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