Kaydet (Commit) ffd2a421 authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Issue 9816: Random.jumpahead(n) didn't work well for small values of n.

üst d55ffdbe
...@@ -46,6 +46,7 @@ from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil ...@@ -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 math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
from os import urandom as _urandom from os import urandom as _urandom
from binascii import hexlify as _hexlify from binascii import hexlify as _hexlify
import hashlib as _hashlib
__all__ = ["Random","seed","random","uniform","randint","choice","sample", __all__ = ["Random","seed","random","uniform","randint","choice","sample",
"randrange","shuffle","normalvariate","lognormvariate", "randrange","shuffle","normalvariate","lognormvariate",
...@@ -141,6 +142,18 @@ class Random(_random.Random): ...@@ -141,6 +142,18 @@ class Random(_random.Random):
"Random.setstate() of version %s" % "Random.setstate() of version %s" %
(version, self.VERSION)) (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 ## ---- Methods below this point do not need to be overridden when
## ---- subclassing for the purpose of using a different core generator. ## ---- subclassing for the purpose of using a different core generator.
......
...@@ -55,8 +55,6 @@ class TestBasicOps(unittest.TestCase): ...@@ -55,8 +55,6 @@ class TestBasicOps(unittest.TestCase):
with test_support.check_py3k_warnings(quiet=True): with test_support.check_py3k_warnings(quiet=True):
self.assertRaises(TypeError, self.gen.jumpahead) # needs an arg 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 self.assertRaises(TypeError, self.gen.jumpahead, 2, 3) # too many
def test_sample(self): def test_sample(self):
......
...@@ -43,6 +43,10 @@ Core and Builtins ...@@ -43,6 +43,10 @@ Core and Builtins
Library 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() - Issue #9792: In case of connection failure, socket.create_connection()
would swallow the exception and raise a new one, making it impossible would swallow the exception and raise a new one, making it impossible
to fetch the original errno, or to filter timeout errors. Now the to fetch the original errno, or to filter timeout errors. Now the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment