Index: base/rand_util.cc |
=================================================================== |
--- base/rand_util.cc (revision 0) |
+++ base/rand_util.cc (revision 0) |
@@ -0,0 +1,47 @@ |
+// Copyright (c) 2008 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/rand_util.h" |
+ |
+#include <math.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/logging.h" |
+ |
+namespace { |
+ |
+union uint64_splitter { |
+ uint64 normal; |
+ uint16 split[4]; |
+}; |
+ |
+} // namespace |
+ |
+namespace base { |
+ |
+int RandInt(int min, int max) { |
+ DCHECK(min <= max); |
+ |
+ uint64 range = static_cast<int64>(max) - min + 1; |
+ uint64 number = base::RandUInt64(); |
+ int result = min + number % range; |
Mark Mentovai
2008/09/29 22:20:05
This needed to be static_cast<int>(number % range)
|
+ DCHECK(result >= min && result <= max); |
+ return result; |
+} |
+ |
+double RandDouble() { |
+ uint64_splitter number; |
+ number.normal = base::RandUInt64(); |
+ |
+ // Standard code based on drand48 would give only 48 bits of precision. |
+ // We try to get maximum precision for IEEE 754 double (52 bits). |
+ double result = ldexp(number.split[0] & 0xf, -52) + |
Mark Mentovai
2008/09/29 22:20:05
MSVC is strict about these too, because its C libr
|
+ ldexp(number.split[1], -48) + |
+ ldexp(number.split[2], -32) + |
+ ldexp(number.split[3], -16); |
+ DCHECK(result >= 0.0 && result < 1.0); |
+ return result; |
+} |
+ |
+} // namespace base |