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