http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48114
--- Comment #3 from Andrey Zholos <aaz at althenia dot net> 2011-03-14 15:23:25 UTC --- I'll add this here since it's in the same place and the test will be similar. For geometric_distribution(.25) the first 10 probabilities are: sample correct p_0 0.000 0.250 p_1 0.750 0.188 p_2 0.187 0.141 p_3 0.046 0.105 p_4 0.012 0.079 p_5 0.003 0.059 p_6 0.001 0.044 p_7 0.000 0.033 p_8 0.000 0.025 p_9 0.000 0.019 The smallest value returned is 1, but should be 0 (and d.min() is correctly 0); and p is used as 1-p. Fix: --- include/c++/bits/random.h +++ include/c++/bits/random.h @@ -3628,8 +3628,8 @@ void _M_initialize() - { _M_log_p = std::log(_M_p); } + { _M_log_1_p = std::log(1 - _M_p); } double _M_p; - double _M_log_p; + double _M_log_1_p; }; --- include/c++/bits/random.tcc +++ include/c++/bits/random.tcc @@ -1027,3 +1027,3 @@ do - __cand = std::ceil(std::log(__aurng()) / __param._M_log_p); + __cand = std::floor(std::log(__aurng()) / __param._M_log_1_p); while (__cand >= __thr); Also, there's a line in random.h _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0)); but the standard only requires 0 < p < 1.