randrange(): Repaired my overly optimistic rewrite, and added comments

explaining what's wrong with the two simpler variants.
This commit is contained in:
Tim Peters 2003-06-19 03:46:46 +00:00
parent afb8979771
commit 76ca1d428f
1 changed files with 13 additions and 1 deletions

View File

@ -148,7 +148,19 @@ class Random(_random.Random):
if istop != stop: if istop != stop:
raise ValueError, "non-integer stop for randrange()" raise ValueError, "non-integer stop for randrange()"
if step == 1 and istart < istop: if step == 1 and istart < istop:
return int(istart + self.random()*(istop - istart)) # Note that
# int(istart + self.random()*(istop - istart))
# instead would be incorrect. For example, consider istart
# = -2 and istop = 0. Then the guts would be in
# -2.0 to 0.0 exclusive on both ends (ignoring that random()
# might return 0.0), and because int() truncates toward 0, the
# final result would be -1 or 0 (instead of -2 or -1).
# istart + int(self.random()*(istop - istart))
# would also be incorrect, for a subtler reason: the RHS
# can return a long, and then randrange() would also return
# a long, but we're supposed to return an int (for backward
# compatibility).
return int(istart + int(self.random()*(istop - istart)))
if step == 1: if step == 1:
raise ValueError, "empty range for randrange()" raise ValueError, "empty range for randrange()"