]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-154001: Avoid division by zero in binomialvariate (GH-154004) (GH-154051)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 19 Jul 2026 08:42:20 +0000 (10:42 +0200)
committerGitHub <noreply@github.com>
Sun, 19 Jul 2026 08:42:20 +0000 (08:42 +0000)
(cherry picked from commit 1f1374009b681814642ca199136815b223fd90ae)

Co-authored-by: Ɓukasz <lukaszlapinski7@gmail.com>
Lib/random.py
Lib/test/test_random.py
Misc/NEWS.d/next/Library/2026-07-18-17-09-49.gh-issue-154001.3brrUv.rst [new file with mode: 0644]

index 726a71e782893c88b6c1385f68352b30d51d1f36..0e6a183d179f48811ad56b48496b931a7253c726 100644 (file)
@@ -861,7 +861,11 @@ class Random(_random.Random):
             u = random()
             u -= 0.5
             us = 0.5 - _fabs(u)
-            k = _floor((2.0 * a / us + b) * u + c)
+            try:
+                k = _floor((2.0 * a / us + b) * u + c)
+            except ZeroDivisionError:
+                # Reject case where random() returned 0.0
+                continue
             if k < 0 or k > n:
                 continue
             v = random()
index 0217ebd132b1104f8053a331002f81c719ceecee..3739fe0ac393b3c2a5742c3e75d1b2a01324ef68 100644 (file)
@@ -1074,6 +1074,14 @@ class TestDistributions(unittest.TestCase):
             self.assertAlmostEqual(s2/(N-1), sigmasqrd, places=2,
                                    msg='%s%r' % (variate.__name__, args))
 
+    def test_binomialvariate_btrs_random_zero(self):
+        for p, expected in ((0.25, 25), (0.75, 75)):
+            with self.subTest(p=p):
+                g = random.Random()
+                with unittest.mock.patch.object(
+                        g, 'random', side_effect=(0.0, 0.5, 0.5)):
+                    self.assertEqual(g.binomialvariate(100, p), expected)
+
     def test_constant(self):
         g = random.Random()
         N = 100
diff --git a/Misc/NEWS.d/next/Library/2026-07-18-17-09-49.gh-issue-154001.3brrUv.rst b/Misc/NEWS.d/next/Library/2026-07-18-17-09-49.gh-issue-154001.3brrUv.rst
new file mode 100644 (file)
index 0000000..ff019aa
--- /dev/null
@@ -0,0 +1,2 @@
+Fix :func:`random.binomialvariate` raising :exc:`ZeroDivisionError`
+when :func:`random.random` returns zero.