| 261 | |
| 262 | |
| 263 | static RAND_INT_TYPE random_hypergeometric_hyp(bitgen_t *bitgen_state, |
| 264 | RAND_INT_TYPE good, |
| 265 | RAND_INT_TYPE bad, |
| 266 | RAND_INT_TYPE sample) { |
| 267 | RAND_INT_TYPE d1, k, z; |
| 268 | double d2, u, y; |
| 269 | |
| 270 | d1 = bad + good - sample; |
| 271 | d2 = (double)MIN(bad, good); |
| 272 | |
| 273 | y = d2; |
| 274 | k = sample; |
| 275 | while (y > 0.0) { |
| 276 | u = next_double(bitgen_state); |
| 277 | y -= (RAND_INT_TYPE)floor(u + y / (d1 + k)); |
| 278 | k--; |
| 279 | if (k == 0) |
| 280 | break; |
| 281 | } |
| 282 | z = (RAND_INT_TYPE)(d2 - y); |
| 283 | if (good > bad) |
| 284 | z = sample - z; |
| 285 | return z; |
| 286 | } |
| 287 | |
| 288 | /* D1 = 2*sqrt(2/e) */ |
| 289 | /* D2 = 3 - 2*sqrt(3/e) */ |
no test coverage detected