--- 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<result_type>::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<result_type>(0, _range/mult)(eng) * mult;
         if(result <= _range)
