diff options
author | Tim Peters <tim.peters@gmail.com> | 2002-08-16 03:41:39 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2002-08-16 03:41:39 (GMT) |
commit | 9146f27b7799dab231083f194a14c6157b57549f (patch) | |
tree | f0d3545bfecf2fa3657b05f747934eed323ba392 /Lib/random.py | |
parent | 012c0a393a27135860e065d490199d16b38a3739 (diff) | |
download | cpython-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.py | 21 |
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()" |