summaryrefslogtreecommitdiffstats
path: root/Lib/random.py
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2002-08-16 03:41:39 (GMT)
committerTim Peters <tim.peters@gmail.com>2002-08-16 03:41:39 (GMT)
commit9146f27b7799dab231083f194a14c6157b57549f (patch)
treef0d3545bfecf2fa3657b05f747934eed323ba392 /Lib/random.py
parent012c0a393a27135860e065d490199d16b38a3739 (diff)
downloadcpython-9146f27b7799dab231083f194a14c6157b57549f.zip
cpython-9146f27b7799dab231083f194a14c6157b57549f.tar.gz
cpython-9146f27b7799dab231083f194a14c6157b57549f.tar.bz2
SF bug 594996: OverflowError in random.randrange
Loosened the acceptable 'start' and 'stop' arguments so that any Python (bounded) ints can be used. So, e.g., randrange(-sys.maxint-1, sys.maxint) no longer blows up.
Diffstat (limited to 'Lib/random.py')
-rw-r--r--Lib/random.py21
1 files changed, 17 insertions, 4 deletions
diff --git a/Lib/random.py b/Lib/random.py
index 6debaf3..4d29080 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -75,6 +75,7 @@ used to "move backward in time":
from math import log as _log, exp as _exp, pi as _pi, e as _e
from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
+from math import floor as _floor
__all__ = ["Random","seed","random","uniform","randint","choice",
"randrange","shuffle","normalvariate","lognormvariate",
@@ -299,7 +300,7 @@ class Random:
"""
# This code is a bit messy to make it fast for the
- # common case while still doing adequate error checking
+ # common case while still doing adequate error checking.
istart = int(start)
if istart != start:
raise ValueError, "non-integer arg 1 for randrange()"
@@ -307,14 +308,26 @@ class Random:
if istart > 0:
return int(self.random() * istart)
raise ValueError, "empty range for randrange()"
+
+ # stop argument supplied.
istop = int(stop)
if istop != stop:
raise ValueError, "non-integer stop for randrange()"
+ if step == 1 and istart < istop:
+ try:
+ return istart + int(self.random()*(istop - istart))
+ except OverflowError:
+ # This can happen if istop-istart > sys.maxint + 1, and
+ # multiplying by random() doesn't reduce it to something
+ # <= sys.maxint. We know that the overall result fits
+ # in an int, and can still do it correctly via math.floor().
+ # But that adds another function call, so for speed we
+ # avoided that whenever possible.
+ return int(istart + _floor(self.random()*(istop - istart)))
if step == 1:
- if istart < istop:
- return istart + int(self.random() *
- (istop - istart))
raise ValueError, "empty range for randrange()"
+
+ # Non-unit step argument supplied.
istep = int(step)
if istep != step:
raise ValueError, "non-integer step for randrange()"