diff options
| author | Raymond Hettinger <python@rcn.com> | 2010-09-10 10:47:22 (GMT) |
|---|---|---|
| committer | Raymond Hettinger <python@rcn.com> | 2010-09-10 10:47:22 (GMT) |
| commit | ffd2a4215a0bfe82f48ff71381bbfce8552f5f0c (patch) | |
| tree | 74cfadca537a186e8564511bca62c81b694434c1 | |
| parent | d55ffdbee38ba9693a2d3346318ef51b5840ea65 (diff) | |
| download | cpython-ffd2a4215a0bfe82f48ff71381bbfce8552f5f0c.zip cpython-ffd2a4215a0bfe82f48ff71381bbfce8552f5f0c.tar.gz cpython-ffd2a4215a0bfe82f48ff71381bbfce8552f5f0c.tar.bz2 | |
Issue 9816: Random.jumpahead(n) didn't work well for small values of n.
| -rw-r--r-- | Lib/random.py | 13 | ||||
| -rw-r--r-- | Lib/test/test_random.py | 2 | ||||
| -rw-r--r-- | Misc/NEWS | 4 |
3 files changed, 17 insertions, 2 deletions
diff --git a/Lib/random.py b/Lib/random.py index f919718..01e1420 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -46,6 +46,7 @@ from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin from os import urandom as _urandom from binascii import hexlify as _hexlify +import hashlib as _hashlib __all__ = ["Random","seed","random","uniform","randint","choice","sample", "randrange","shuffle","normalvariate","lognormvariate", @@ -141,6 +142,18 @@ class Random(_random.Random): "Random.setstate() of version %s" % (version, self.VERSION)) + def jumpahead(self, n): + """Change the internal state to one that is likely far away + from the current state. This method will not be in Py3.x, + so it is better to simply reseed. + """ + # The super.jumpahead() method uses shuffling to change state, + # so it needs a large and "interesting" n to work with. Here, + # we use hashing to create a large n for the shuffle. + s = repr(n) + repr(self.getstate()) + n = int(_hashlib.new('sha512', s).hexdigest(), 16) + super(Random, self).jumpahead(n) + ## ---- Methods below this point do not need to be overridden when ## ---- subclassing for the purpose of using a different core generator. diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 94c20ce..df82990 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -55,8 +55,6 @@ class TestBasicOps(unittest.TestCase): with test_support.check_py3k_warnings(quiet=True): self.assertRaises(TypeError, self.gen.jumpahead) # needs an arg - self.assertRaises(TypeError, self.gen.jumpahead, "ick") # wrong type - self.assertRaises(TypeError, self.gen.jumpahead, 2.3) # wrong type self.assertRaises(TypeError, self.gen.jumpahead, 2, 3) # too many def test_sample(self): @@ -43,6 +43,10 @@ Core and Builtins Library ------- +- Issue #9816: random.Random.jumpahead(n) did not produce a sufficiently + different internal state for small values of n. Fixed by salting the + value. + - Issue #9792: In case of connection failure, socket.create_connection() would swallow the exception and raise a new one, making it impossible to fetch the original errno, or to filter timeout errors. Now the |
