From: Tim Peters Date: Thu, 19 Jun 2003 03:46:46 +0000 (+0000) Subject: randrange(): Repaired my overly optimistic rewrite, and added comments X-Git-Tag: v2.3c1~375 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=76ca1d428f96284ed58f4523b698ed95c6fdbdb2;p=python randrange(): Repaired my overly optimistic rewrite, and added comments explaining what's wrong with the two simpler variants. --- diff --git a/Lib/random.py b/Lib/random.py index 0937ba20dc..1ae25532d3 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -148,7 +148,19 @@ class Random(_random.Random): if istop != stop: raise ValueError, "non-integer stop for randrange()" 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: raise ValueError, "empty range for randrange()"