From 72c2e1b56e35c7fc4a80e90b14541494426e3cd0 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 19 Feb 1998 21:17:42 +0000 Subject: [PATCH] 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. --- Lib/random.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Lib/random.py b/Lib/random.py index ebab1f80f9e..49921cb8b34 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -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