diff --git a/Lib/random.py b/Lib/random.py index 7bb3c9a6fa08c40..25cf9bb42d22c07 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -828,7 +828,11 @@ def binomialvariate(self, n=1, p=0.5): if not c: return x while True: - y += _floor(_log2(random()) / c) + 1 + try: + y += _floor(_log2(random()) / c) + 1 + except ValueError: + # Reject case where random() returned 0.0 + continue if y > n: return x x += 1 diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 3c4aa91452443b8..1e7be504bff24e5 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -1101,6 +1101,13 @@ def test_avg_std(self): self.assertAlmostEqual(s2/(N-1), sigmasqrd, places=2, msg='%s%r' % (variate.__name__, args)) + def test_binomialvariate_log_zero(self): + # gh-149222: Variety random() return 0.0 no input Error + with unittest.mock.patch.object(random.Random, 'random', side_effect=[0.0] + [0.5] * 20): + result = random.binomialvariate(10, 0.5) + self.assertIsInstance(result, int) + self.assertIn(result, range(11)) + def test_binomialvariate_btrs_random_zero(self): for p, expected in ((0.25, 25), (0.75, 75)): with self.subTest(p=p): diff --git a/Misc/NEWS.d/next/Library/2026-05-02-13-54-19.gh-issue-149221.__KOks.rst b/Misc/NEWS.d/next/Library/2026-05-02-13-54-19.gh-issue-149221.__KOks.rst new file mode 100644 index 000000000000000..fab2b0f6a234891 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-05-02-13-54-19.gh-issue-149221.__KOks.rst @@ -0,0 +1 @@ +Catch rare math domain error for :func:`random.binomialvariate`.