1 // Copyright (c) 2011 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.
5 #include "base/rand_util.h"
13 #include "base/basictypes.h"
14 #include "base/logging.h"
15 #include "base/strings/string_util.h"
19 int RandInt(int min
, int max
) {
22 uint64 range
= static_cast<uint64
>(max
) - min
+ 1;
23 int result
= min
+ static_cast<int>(base::RandGenerator(range
));
24 DCHECK_GE(result
, min
);
25 DCHECK_LE(result
, max
);
30 return BitsToOpenEndedUnitInterval(base::RandUint64());
33 double BitsToOpenEndedUnitInterval(uint64 bits
) {
34 // We try to get maximum precision by masking out as many bits as will fit
35 // in the target type's mantissa, and raising it to an appropriate power to
36 // produce output in the range [0, 1). For IEEE 754 doubles, the mantissa
37 // is expected to accommodate 53 bits.
39 COMPILE_ASSERT(std::numeric_limits
<double>::radix
== 2, otherwise_use_scalbn
);
40 static const int kBits
= std::numeric_limits
<double>::digits
;
41 uint64 random_bits
= bits
& ((UINT64_C(1) << kBits
) - 1);
42 double result
= ldexp(static_cast<double>(random_bits
), -1 * kBits
);
43 DCHECK_GE(result
, 0.0);
44 DCHECK_LT(result
, 1.0);
48 uint64
RandGenerator(uint64 range
) {
50 // We must discard random results above this number, as they would
51 // make the random generator non-uniform (consider e.g. if
52 // MAX_UINT64 was 7 and |range| was 5, then a result of 1 would be twice
53 // as likely as a result of 3 or 4).
54 uint64 max_acceptable_value
=
55 (std::numeric_limits
<uint64
>::max() / range
) * range
- 1;
59 value
= base::RandUint64();
60 } while (value
> max_acceptable_value
);
65 std::string
RandBytesAsString(size_t length
) {
66 DCHECK_GT(length
, 0u);
68 RandBytes(WriteInto(&result
, length
+ 1), length
);