bpo-33203: Ensure random.choice always raises IndexError on empty sequence (GH-6338) (GH-6387)

(cherry picked from commit 091e95e9004b794280ab35becec2c3e30dd5e96e)

Co-authored-by: Wolfgang Maier <wolfgang.maier@biologie.uni-freiburg.de>
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 @@
                 "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 @@
             # 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: