Opened 9 years ago
Closed 9 years ago
#9652 closed Bugs (fixed)
Infinite loop in random::binomial_distribution
Reported by: | Owned by: | No-Maintainer | |
---|---|---|---|
Milestone: | To Be Determined | Component: | random |
Version: | Boost Development Trunk | Severity: | Problem |
Keywords: | Cc: |
Description
There is a potential infinite loop in binomial_distribution::invert(). The problem is caused by round-off errors. The condition required for the infinite loop is:
t (no. trials) is large
p (probability) is small
uniform_01 returns a number very close to 1.
I found this problem in Boost 1.48.0, but the relevant part of the code is the same in development trunk.
The issue can be reproduced by the following program.
#include <iostream> #include "boost/random/binomial_distribution.hpp" /* PSEUDO uniform random number generater. */ class URNG { public: typedef unsigned long int result_type; result_type operator()() {return _ret_val;} result_type min() const {return 0;} result_type max() const {return std::numeric_limits<result_type>::max();} URNG(result_type ret_val) : _ret_val(ret_val) {} private: result_type _ret_val; }; int main(void) { typedef boost::random::binomial_distribution<long int, double> Binom; Binom binom(41344,4.87026e-05); URNG urng_small(1024); std::cout << "Draw a number from a binomial distribution." << std::endl; std::cout << "binom returns " << binom(urng_small) << std::endl; URNG urng_big(std::numeric_limits<unsigned long int>::max() - 1024); std::cout << "Draw again a number from a binomial distribution." << std::endl; std::cout << "binom does not return (infinite loop) " << binom(urng_big) << std::endl; return 0; }
Note:
See TracTickets
for help on using tickets.
Fixed in http://github.com/boostorg/random/commit/9cd247da37bd9b13c06956c4d3901376f0e00722.