Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/rand_util.h"
      6 
      7 #include <math.h>
      8 
      9 #include <limits>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/logging.h"
     13 
     14 namespace base {
     15 
     16 int RandInt(int min, int max) {
     17   DCHECK(min <= max);
     18 
     19   uint64 range = static_cast<uint64>(max) - min + 1;
     20   int result = min + static_cast<int>(base::RandGenerator(range));
     21   DCHECK(result >= min && result <= max);
     22   return result;
     23 }
     24 
     25 double RandDouble() {
     26   // We try to get maximum precision by masking out as many bits as will fit
     27   // in the target type's mantissa, and raising it to an appropriate power to
     28   // produce output in the range [0, 1).  For IEEE 754 doubles, the mantissa
     29   // is expected to accommodate 53 bits.
     30 
     31   COMPILE_ASSERT(std::numeric_limits<double>::radix == 2, otherwise_use_scalbn);
     32   static const int kBits = std::numeric_limits<double>::digits;
     33   uint64 random_bits = base::RandUint64() & ((GG_UINT64_C(1) << kBits) - 1);
     34   double result = ldexp(static_cast<double>(random_bits), -1 * kBits);
     35   DCHECK(result >= 0.0 && result < 1.0);
     36   return result;
     37 }
     38 
     39 uint64 RandGenerator(uint64 max) {
     40   DCHECK_GT(max, 0ULL);
     41   return base::RandUint64() % max;
     42 }
     43 
     44 }  // namespace base
     45