Index: webrtc/test/random.cc |
diff --git a/webrtc/test/random.cc b/webrtc/test/random.cc |
index c4c405f6b8884732de3d3bc7e95ddb80f026190a..b9b599e264f624d6077df74b1d0bf4499ed86b78 100644 |
--- a/webrtc/test/random.cc |
+++ b/webrtc/test/random.cc |
@@ -21,7 +21,22 @@ namespace test { |
Random::Random(uint32_t seed) : a_(0x531FDB97 ^ seed), b_(0x6420ECA8 + seed) { |
} |
-float Random::Rand() { |
+uint32_t Random::Rand(uint32_t t) { |
+ uint64_t result = t; |
+ result = b_ * (result + 1); |
pbos-webrtc
2015/11/06 10:35:21
static_cast<uint64_t>(t) instead of result, that m
terelius
2015/11/06 10:59:19
Done.
|
+ result = result >> 32; |
pbos-webrtc
2015/11/06 10:35:21
result >>= 32;
terelius
2015/11/06 10:59:19
Done.
|
+ 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 +44,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 +64,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 |