Skip to content

Commit 9392058

Browse files
committed
gh-154001: Avoid division by zero in binomialvariate
1 parent 0fa144b commit 9392058

3 files changed

Lines changed: 12 additions & 0 deletions

File tree

Lib/random.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,8 @@ def binomialvariate(self, n=1, p=0.5):
861861
u = random()
862862
u -= 0.5
863863
us = 0.5 - _fabs(u)
864+
if us == 0.0:
865+
continue
864866
k = _floor((2.0 * a / us + b) * u + c)
865867
if k < 0 or k > n:
866868
continue

Lib/test/test_random.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,6 +1082,14 @@ def test_binomialvariate_log_zero(self):
10821082
self.assertIsInstance(result, int)
10831083
self.assertIn(result, range(11))
10841084

1085+
def test_binomialvariate_btrs_random_zero(self):
1086+
for p, expected in ((0.25, 25), (0.75, 75)):
1087+
with self.subTest(p=p):
1088+
g = random.Random()
1089+
with unittest.mock.patch.object(
1090+
g, 'random', side_effect=(0.0, 0.5, 0.5)):
1091+
self.assertEqual(g.binomialvariate(100, p), expected)
1092+
10851093
def test_constant(self):
10861094
g = random.Random()
10871095
N = 100
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :meth:`random.Random.binomialvariate` raising :exc:`ZeroDivisionError`
2+
when a random draw is zero.

0 commit comments

Comments
 (0)