Bug #1590891: random.randrange don't return correct value for big number
authorRaymond Hettinger <python@rcn.com>
Wed, 20 Dec 2006 07:43:59 +0000 (07:43 +0000)
committerRaymond Hettinger <python@rcn.com>
Wed, 20 Dec 2006 07:43:59 +0000 (07:43 +0000)
Lib/random.py
Lib/test/test_random.py
Misc/NEWS

index ae2d434b3111782690cb2c7b95d7334a0d8c3d87..b80f1a1c3f08433cef60a06ed08d91bd23921843 100644 (file)
@@ -205,7 +205,7 @@ class Random(_random.Random):
             raise ValueError, "empty range for randrange()"
 
         if n >= maxwidth:
-            return istart + self._randbelow(n)
+            return istart + istep*self._randbelow(n)
         return istart + istep*int(self.random() * n)
 
     def randint(self, a, b):
index bba4c7cf8ba5cda267a2f8c336127d13f1827e6f..6c326358290b74d462b868f395a1ed9487728ba0 100644 (file)
@@ -439,6 +439,14 @@ class MersenneTwister_TestBasicOps(TestBasicOps):
             self.assertEqual(k, numbits)        # note the stronger assertion
             self.assert_(2**k > n > 2**(k-1))   # note the stronger assertion
 
+    def test_randrange_bug_1590891(self):
+        start = 1000000000000
+        stop = -100000000000000000000
+        step = -200
+        x = self.gen.randrange(start, stop, step)
+        self.assert_(stop < x <= start)
+        self.assertEqual((x+stop)%step, 0)
+
 _gammacoeff = (0.9999999999995183, 676.5203681218835, -1259.139216722289,
               771.3234287757674,  -176.6150291498386, 12.50734324009056,
               -0.1385710331296526, 0.9934937113930748e-05, 0.1659470187408462e-06)
index c1a505284c8a4d347bb90559c34aff35018af45d..93e9d0ab970b863fc62e7bab3d7c14db862d4f48 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.5.1c1?
 Core and builtins
 -----------------
 
+- Bug #1590891: random.randrange don't return correct value for big number
+
 - Bug #1456209: In some obscure cases it was possible for a class with a
   custom ``__eq__()`` method to confuse set internals when class instances
   were used as a set's elements and the ``__eq__()`` method mutated the set.