]> granicus.if.org Git - python/commitdiff
Issue 9816: Random.jumpahead(n) didn't work well for small values of n.
authorRaymond Hettinger <python@rcn.com>
Fri, 10 Sep 2010 10:47:22 +0000 (10:47 +0000)
committerRaymond Hettinger <python@rcn.com>
Fri, 10 Sep 2010 10:47:22 +0000 (10:47 +0000)
Lib/random.py
Lib/test/test_random.py
Misc/NEWS

index f919718a6db012725a2f8b485e574e4749edf697..01e1420df6d1855e743acfc3e609f97dc8343ebf 100644 (file)
@@ -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.
 
index 94c20ceb9b511abb33d7eceea23ba1279fb7edc1..df82990cc9157e525d3964806183c0816c7fce12 100644 (file)
@@ -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):
index e509895e9498f9e3ffca2575ac17810c152fa56e..13cec41ba7d93de1f75ee8805b2d3258911c32fe 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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