(self)
| 1100 | self.assertEqual(variate(*args), expected) |
| 1101 | |
| 1102 | def test_binomialvariate(self): |
| 1103 | B = random.binomialvariate |
| 1104 | |
| 1105 | # Cover all the code paths |
| 1106 | with self.assertRaises(ValueError): |
| 1107 | B(n=-1) # Negative n |
| 1108 | with self.assertRaises(ValueError): |
| 1109 | B(n=1, p=-0.5) # Negative p |
| 1110 | with self.assertRaises(ValueError): |
| 1111 | B(n=1, p=1.5) # p > 1.0 |
| 1112 | self.assertEqual(B(0, 0.5), 0) # n == 0 |
| 1113 | self.assertEqual(B(10, 0.0), 0) # p == 0.0 |
| 1114 | self.assertEqual(B(10, 1.0), 10) # p == 1.0 |
| 1115 | self.assertTrue(B(1, 0.3) in {0, 1}) # n == 1 fast path |
| 1116 | self.assertTrue(B(1, 0.9) in {0, 1}) # n == 1 fast path |
| 1117 | self.assertTrue(B(1, 0.0) in {0}) # n == 1 fast path |
| 1118 | self.assertTrue(B(1, 1.0) in {1}) # n == 1 fast path |
| 1119 | |
| 1120 | # BG method very small p |
| 1121 | self.assertEqual(B(5, 1e-18), 0) |
| 1122 | |
| 1123 | # BG method p <= 0.5 and n*p=1.25 |
| 1124 | self.assertTrue(B(5, 0.25) in set(range(6))) |
| 1125 | |
| 1126 | # BG method p >= 0.5 and n*(1-p)=1.25 |
| 1127 | self.assertTrue(B(5, 0.75) in set(range(6))) |
| 1128 | |
| 1129 | # BTRS method p <= 0.5 and n*p=25 |
| 1130 | self.assertTrue(B(100, 0.25) in set(range(101))) |
| 1131 | |
| 1132 | # BTRS method p > 0.5 and n*(1-p)=25 |
| 1133 | self.assertTrue(B(100, 0.75) in set(range(101))) |
| 1134 | |
| 1135 | # Statistical tests chosen such that they are |
| 1136 | # exceedingly unlikely to ever fail for correct code. |
| 1137 | |
| 1138 | # BG code path |
| 1139 | # Expected dist: [31641, 42188, 21094, 4688, 391] |
| 1140 | c = Counter(B(4, 0.25) for i in range(100_000)) |
| 1141 | self.assertTrue(29_641 <= c[0] <= 33_641, c) |
| 1142 | self.assertTrue(40_188 <= c[1] <= 44_188) |
| 1143 | self.assertTrue(19_094 <= c[2] <= 23_094) |
| 1144 | self.assertTrue(2_688 <= c[3] <= 6_688) |
| 1145 | self.assertEqual(set(c), {0, 1, 2, 3, 4}) |
| 1146 | |
| 1147 | # BTRS code path |
| 1148 | # Sum of c[20], c[21], c[22], c[23], c[24] expected to be 36,214 |
| 1149 | c = Counter(B(100, 0.25) for i in range(100_000)) |
| 1150 | self.assertTrue(34_214 <= c[20]+c[21]+c[22]+c[23]+c[24] <= 38_214) |
| 1151 | self.assertTrue(set(c) <= set(range(101))) |
| 1152 | self.assertEqual(c.total(), 100_000) |
| 1153 | |
| 1154 | # Demonstrate the BTRS works for huge values of n |
| 1155 | self.assertTrue(19_000_000 <= B(100_000_000, 0.2) <= 21_000_000) |
| 1156 | self.assertTrue(89_000_000 <= B(100_000_000, 0.9) <= 91_000_000) |
| 1157 | |
| 1158 | |
| 1159 | def test_von_mises_range(self): |
nothing calls this directly
no test coverage detected