summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/random.py2
-rw-r--r--Lib/test/test_random.py5
-rw-r--r--Misc/NEWS.d/next/Library/2018-04-05-11-09-45.bpo-33203.Hje9Py.rst3
3 files changed, 9 insertions, 1 deletions
diff --git a/Lib/random.py b/Lib/random.py
index 91065b7..0bc2417 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -242,6 +242,8 @@ class Random(_random.Random):
"enough bits to choose from a population range this large.\n"
"To remove the range limitation, add a getrandbits() method.")
return int(random() * n)
+ if n == 0:
+ raise ValueError("Boundary cannot be zero")
rem = maxsize % n
limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
r = random()
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py
index 468c4a4..eee245d 100644
--- a/Lib/test/test_random.py
+++ b/Lib/test/test_random.py
@@ -651,7 +651,10 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase):
# Population range too large (n >= maxsize)
self.gen._randbelow(maxsize+1, maxsize = maxsize)
self.gen._randbelow(5640, maxsize = maxsize)
-
+ # issue 33203: test that _randbelow raises ValueError on
+ # n == 0 also in its getrandbits-independent branch.
+ with self.assertRaises(ValueError):
+ self.gen._randbelow(0, maxsize=maxsize)
# This might be going too far to test a single line, but because of our
# noble aim of achieving 100% test coverage we need to write a case in
# which the following line in Random._randbelow() gets executed:
diff --git a/Misc/NEWS.d/next/Library/2018-04-05-11-09-45.bpo-33203.Hje9Py.rst b/Misc/NEWS.d/next/Library/2018-04-05-11-09-45.bpo-33203.Hje9Py.rst
new file mode 100644
index 0000000..ab6d17b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-04-05-11-09-45.bpo-33203.Hje9Py.rst
@@ -0,0 +1,3 @@
+``random.Random.choice()`` now raises ``IndexError`` for empty sequences
+consistently even when called from subclasses without a ``getrandbits()``
+implementation.