OSDN Git Service

2007-10-19 Paolo Carlini <pcarlini@suse.de>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Oct 2007 17:36:03 +0000 (17:36 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Oct 2007 17:36:03 +0000 (17:36 +0000)
PR libstdc++/33815
* include/tr1_impl/random
(uniform_int<>::_M_call(_UniformRandomNumberGenerator&, result_type,
result_type, true_type)): Avoid the modulo (which uses the low-order
bits).

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129493 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1_impl/random

index b12b8b3..b4f58ac 100644 (file)
@@ -1,5 +1,13 @@
 2007-10-19  Paolo Carlini  <pcarlini@suse.de>
 
+       PR libstdc++/33815
+       * include/tr1_impl/random
+       (uniform_int<>::_M_call(_UniformRandomNumberGenerator&, result_type,
+       result_type, true_type)): Avoid the modulo (which uses the low-order
+       bits).
+
+2007-10-19  Paolo Carlini  <pcarlini@suse.de>
+
        * include/bits/stl_algobase.h (struct __cm_assign,
        struct __copy_move, struct __copy_move_backward, move,
        move_backward): Add.
index e855307..f44b17f 100644 (file)
@@ -1605,9 +1605,13 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
         _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.max())
+                               - __utype(__urng.min()) + 1.0L)) + __min;
        }
 
       template<typename _UniformRandomNumberGenerator>