Author: Amaury Forgeot d'Arc <amaur...@gmail.com>
Branch: py3k
Changeset: r49347:7ea6a7e448e0
Date: 2011-11-11 21:48 +0100
http://bitbucket.org/pypy/pypy/changeset/7ea6a7e448e0/

Log:    Fix _random.get_randbits()

diff --git a/pypy/module/_random/interp_random.py 
b/pypy/module/_random/interp_random.py
--- a/pypy/module/_random/interp_random.py
+++ b/pypy/module/_random/interp_random.py
@@ -91,11 +91,11 @@
             raise OperationError(space.w_ValueError, strerror)
         needed = (k - 1) // rbigint.SHIFT + 1
         result = rbigint.rbigint([rbigint.NULLDIGIT] * needed, 1)
-        for i in range(needed - 1):
-            # This loses some random digits, but not too many since SHIFT=31
-            value = self._rnd.genrand32()
+        for i in range(needed):
+            # This wastes some random digits, but not too many since SHIFT=31
+            value = self._rnd.genrand32() & rbigint.MASK
             if i < needed - 1:
-                result.setdigit(i, value & rbigint.MASK)
+                result.setdigit(i, value)
             else:
                 result.setdigit(i, value >> ((needed * rbigint.SHIFT) - k))
         return space.newlong_from_rbigint(result)
diff --git a/pypy/module/_random/test/test_random.py 
b/pypy/module/_random/test/test_random.py
--- a/pypy/module/_random/test/test_random.py
+++ b/pypy/module/_random/test/test_random.py
@@ -98,6 +98,7 @@
         for n in range(10, 1000, 15):
             k = rnd.getrandbits(n)
             assert 0 <= k < 2 ** n
+        assert rnd.getrandbits(30) != 0 # Fails every 1e10 runs
 
     def test_subclass(self):
         import _random
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to