mirror of https://github.com/python/cpython
randrange(): Repaired my overly optimistic rewrite, and added comments
explaining what's wrong with the two simpler variants.
This commit is contained in:
parent
afb8979771
commit
76ca1d428f
|
@ -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()"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue