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.

Bugfix candidate (random.gauss() has always been broken in this way),
despite that it may change results.
This commit is contained in:
Tim Peters 2002-05-05 20:40:00 +00:00
parent 2b41b0d6a7
commit 46c04e140c
3 changed files with 30 additions and 1 deletions

View File

@ -116,7 +116,6 @@ class Random:
""" """
self.seed(x) self.seed(x)
self.gauss_next = None
## -------------------- core generator ------------------- ## -------------------- core generator -------------------
@ -150,6 +149,8 @@ class Random:
a, z = divmod(a, 30322) a, z = divmod(a, 30322)
self._seed = int(x)+1, int(y)+1, int(z)+1 self._seed = int(x)+1, int(y)+1, int(z)+1
self.gauss_next = None
def random(self): def random(self):
"""Get the next random number in the range [0.0, 1.0).""" """Get the next random number in the range [0.0, 1.0)."""
@ -238,6 +239,8 @@ class Random:
# Zero is a poor seed, so substitute 1 # Zero is a poor seed, so substitute 1
self._seed = (x or 1, y or 1, z or 1) self._seed = (x or 1, y or 1, z or 1)
self.gauss_next = None
def whseed(self, a=None): def whseed(self, a=None):
"""Seed from hashable object's hash code. """Seed from hashable object's hash code.

19
Lib/test/test_random.py Normal file
View File

@ -0,0 +1,19 @@
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)

View File

@ -104,6 +104,13 @@ Extension modules
Library 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 - The pickle.Pickler class grew a clear_memo() method to mimic that
provided by cPickle.Pickler. provided by cPickle.Pickler.