OSDN Git Service

2010-03-30 Johannes Singler <singler@kit.edu>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / parallel / random_shuffle.h
index 137414f..baad24d 100644 (file)
@@ -106,7 +106,7 @@ namespace __gnu_parallel
       _DRandomShufflingGlobalData<_RAIter>* _M_sd;
     };
 
-  /** @brief Generate a random number in @__c [0,2^__logp).
+  /** @brief Generate a random number in @c [0,2^__logp).
     *  @param __logp Logarithm (basis 2) of the upper range __bound.
     *  @param __rng Random number generator to use.
     */
@@ -322,10 +322,16 @@ namespace __gnu_parallel
        }
 #endif
 
-      __num_threads = std::min<_BinIndex>(__num_threads, __num_bins);
+      __num_bins = __round_up_to_pow2(
+                        std::max<_BinIndex>(__num_threads, __num_bins));
 
       if (__num_threads <= 1)
-       return __sequential_random_shuffle(__begin, __end, __rng);
+      {
+        _RandomNumber __derived_rng(
+                            __rng(std::numeric_limits<uint32_t>::max()));
+       __sequential_random_shuffle(__begin, __end, __derived_rng);
+        return;
+      }
 
       _DRandomShufflingGlobalData<_RAIter> __sd(__begin);
       _DRSSorterPU<_RAIter, _RandomNumber >* __pus;