--- uniform_int.hpp 2004-03-03 15:23:11.000000000 +0000 +++ uniform_int.hpp.sam_k 2004-08-23 18:53:56.000000000 +0000 @@ -80,8 +80,9 @@ // take extra care to avoid overflows result_type limit; if(_range == (std::numeric_limits::max)()) { + // compute (range+1)/(brange+1) without computing (range+1) : limit = _range/(result_type(brange)+1); - if(_range % result_type(brange)+1 == result_type(brange)) + if(_range % (result_type(brange)+1) == result_type(brange)) ++limit; } else { limit = (_range+1)/(result_type(brange)+1); @@ -90,13 +91,13 @@ // For every power of (brange+1), we determine a random factor result_type result = result_type(0); result_type mult = result_type(1); - while(mult <= limit) { + while(mult < limit) { result += (eng() - bmin) * mult; mult *= result_type(brange)+result_type(1); } if(mult == limit) // _range+1 is an integer power of brange+1: no rejections required - return result; + return _min + result + (eng()-bmin)*mult; // _range/mult < brange+1 -> no endless loop result += uniform_int(0, _range/mult)(eng) * mult; if(result <= _range)