summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-05-29 17:51:31 (GMT)
committerGuido van Rossum <guido@python.org>1998-05-29 17:51:31 (GMT)
commitd03e1197cb5052e3f758794e2a7aecf9f5ca5f46 (patch)
treeb75a6ed60d4dde281e1d8fa40d4eccf0f044c312
parentb39e461b89a587116b56f57a5e34ebb479466dd8 (diff)
downloadcpython-d03e1197cb5052e3f758794e2a7aecf9f5ca5f46.zip
cpython-d03e1197cb5052e3f758794e2a7aecf9f5ca5f46.tar.gz
cpython-d03e1197cb5052e3f758794e2a7aecf9f5ca5f46.tar.bz2
Make gauss() semi-thread-safe. It can still give duplicate results,
but it can no longer raise an exception when called by several threads simultaneously.
-rw-r--r--Lib/random.py18
1 files changed, 14 insertions, 4 deletions
diff --git a/Lib/random.py b/Lib/random.py
index d95c324..a19059c 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -15,6 +15,10 @@
# Translated from anonymously contributed C/C++ source.
+# Multi-threading note: the random number generator used here is not
+# thread-safe; it is possible that two calls return the same random
+# value. See whrandom.py for more info.
+
import whrandom
from whrandom import random, uniform, randint, choice # Also for export!
from math import log, exp, pi, e, sqrt, acos, cos, sin
@@ -243,12 +247,18 @@ def gauss(mu, sigma):
# (Lambert Meertens)
# (corrected version; bug discovered by Mike Miller, fixed by LM)
+ # Multithreading note: When two threads call this function
+ # simultaneously, it is possible that they will receive the
+ # same return value. The window is very small though. To
+ # avoid this, you have to use a lock around all calls. (I
+ # didn't want to slow this down in the serial case by using a
+ # lock here.)
+
global gauss_next
- if gauss_next != None:
- z = gauss_next
- gauss_next = None
- else:
+ z = gauss_next
+ gauss_next = None
+ if z is None:
x2pi = random() * TWOPI
g2rad = sqrt(-2.0 * log(1.0 - random()))
z = cos(x2pi) * g2rad