"""
self.seed(x)
- self.gauss_next = None
## -------------------- core generator -------------------
a, z = divmod(a, 30322)
self._seed = int(x)+1, int(y)+1, int(z)+1
+ self.gauss_next = None
+
def random(self):
"""Get the next random number in the range [0.0, 1.0)."""
# Zero is a poor seed, so substitute 1
self._seed = (x or 1, y or 1, z or 1)
+ self.gauss_next = None
+
def whseed(self, a=None):
"""Seed from hashable object's hash code.
--- /dev/null
+import test_support
+import random
+
+# Ensure that the seed() method initializes all the hidden state. In
+# particular, through 2.2.1 it failed to reset a piece of state used by
+# (and only by) the .gauss() method.
+
+for seed in 1, 12, 123, 1234, 12345, 123456, 654321:
+ for seeder in random.seed, random.whseed:
+ seeder(seed)
+ x1 = random.random()
+ y1 = random.gauss(0, 1)
+
+ seeder(seed)
+ x2 = random.random()
+ y2 = random.gauss(0, 1)
+
+ test_support.vereq(x1, x2)
+ test_support.vereq(y1, y2)
Library
+- random.gauss() uses a piece of hidden state used by nothing else,
+ and the .seed() and .whseed() methods failed to reset it. In other
+ words, setting the seed didn't completely determine the sequence of
+ results produced by random.gauss(). It does now. Programs repeatedly
+ mixing calls to a seed method with calls to gauss() may see different
+ results now.
+
- The pickle.Pickler class grew a clear_memo() method to mimic that
provided by cPickle.Pickler.