| Index: webrtc/test/random.cc
|
| diff --git a/webrtc/test/random.cc b/webrtc/test/random.cc
|
| index c4c405f6b8884732de3d3bc7e95ddb80f026190a..0a82b8d72d938e327f27ebacacb8f15f2935f1a7 100644
|
| --- a/webrtc/test/random.cc
|
| +++ b/webrtc/test/random.cc
|
| @@ -21,7 +21,23 @@ namespace test {
|
| Random::Random(uint32_t seed) : a_(0x531FDB97 ^ seed), b_(0x6420ECA8 + seed) {
|
| }
|
|
|
| -float Random::Rand() {
|
| +uint32_t Random::Rand(uint32_t t) {
|
| + // If b / 2^32 is uniform on [0,1), then b / 2^32 * (t+1) is uniform on
|
| + // the interval [0,t+1), so the integer part is uniform on [0,t].
|
| + uint64_t result = b_ * (static_cast<uint64_t>(t) + 1);
|
| + result >>= 32;
|
| + a_ ^= b_;
|
| + b_ += a_;
|
| + return result;
|
| +}
|
| +
|
| +uint32_t Random::Rand(uint32_t low, uint32_t high) {
|
| + RTC_DCHECK(low <= high);
|
| + return Rand(high - low) + low;
|
| +}
|
| +
|
| +template <>
|
| +float Random::Rand<float>() {
|
| const double kScale = 1.0f / (static_cast<uint64_t>(1) << 32);
|
| double result = kScale * b_;
|
| a_ ^= b_;
|
| @@ -29,10 +45,9 @@ float Random::Rand() {
|
| return static_cast<float>(result);
|
| }
|
|
|
| -int Random::Rand(int low, int high) {
|
| - RTC_DCHECK(low <= high);
|
| - float uniform = Rand() * (high - low + 1) + low;
|
| - return static_cast<int>(uniform);
|
| +template <>
|
| +bool Random::Rand<bool>() {
|
| + return Rand(0, 1) == 1;
|
| }
|
|
|
| int Random::Gaussian(int mean, int standard_deviation) {
|
| @@ -50,7 +65,7 @@ int Random::Gaussian(int mean, int standard_deviation) {
|
| }
|
|
|
| int Random::Exponential(float lambda) {
|
| - float uniform = Rand();
|
| + float uniform = Rand<float>();
|
| return static_cast<int>(-log(uniform) / lambda);
|
| }
|
| } // namespace test
|
|
|