]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorPaolo Carlini <paolo@gcc.gnu.org>
Sat, 20 Oct 2007 10:02:34 +0000 (10:02 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sat, 20 Oct 2007 10:02:34 +0000 (10:02 +0000)
2007-10-20  Paolo Carlini  <pcarlini@suse.de>

* include/tr1/random
(uniform_int<>::_M_call(_UniformRandomNumberGenerator&, result_type,
result_type, true_type)): Fix small thinko.

2007-10-19  Paolo Carlini  <pcarlini@suse.de>

PR libstdc++/33815
* include/tr1/random
(uniform_int<>::_M_call(_UniformRandomNumberGenerator&, result_type,
result_type, true_type)): Avoid the modulo (which uses the low-order
bits).

From-SVN: r129507

libstdc++-v3/include/tr1/random

index c97f16d2a2d7a196333228db616d8b960acc59b2..492adfd5e74c28601bb1dec9e0baece564adb6f5 100644 (file)
@@ -1618,10 +1618,15 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
         result_type
         _M_call(_UniformRandomNumberGenerator& __urng,
                result_type __min, result_type __max, true_type)
-        { 
+        {
+         // XXX Must be fixed to also work when __urng.max() - __urng.min()
+         // is smaller than __max - __min.
          typedef typename __gnu_cxx::__add_unsigned<typename
            _UniformRandomNumberGenerator::result_type>::__type __utype;
-         return result_type(__utype(__urng()) % (__max - __min + 1)) + __min;
+         return result_type((__max - __min + 1.0L)
+                            * (__utype(__urng()) - __utype(__urng.min()))
+                            / (__utype(__urng.max())
+                               - __utype(__urng.min()) + 1.0L)) + __min;
        }
 
       template<typename _UniformRandomNumberGenerator>