random_number_generator.cc 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright 2018 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.
  4. #include "media/learning/impl/random_number_generator.h"
  5. #include <limits>
  6. #include "base/rand_util.h"
  7. namespace media {
  8. class BaseRandomNumberGenerator : public RandomNumberGenerator {
  9. public:
  10. uint64_t Generate() override { return base::RandUint64(); }
  11. protected:
  12. ~BaseRandomNumberGenerator() override = default;
  13. };
  14. // static
  15. RandomNumberGenerator* RandomNumberGenerator::Default() {
  16. static BaseRandomNumberGenerator* rng = nullptr;
  17. // TODO(liberato): locking?
  18. if (!rng)
  19. rng = new BaseRandomNumberGenerator();
  20. return rng;
  21. }
  22. uint64_t RandomNumberGenerator::Generate(uint64_t range) {
  23. // Don't just % generate(), since that wouldn't be uniform anymore.
  24. // This is copied from base/rand_util.cc .
  25. uint64_t max_acceptable_value =
  26. (std::numeric_limits<uint64_t>::max() / range) * range - 1;
  27. uint64_t value;
  28. do {
  29. value = Generate();
  30. } while (value > max_acceptable_value);
  31. return value % range;
  32. }
  33. double RandomNumberGenerator::GenerateDouble(double range) {
  34. return base::BitsToOpenEndedUnitInterval(Generate()) * range;
  35. }
  36. HasRandomNumberGenerator::HasRandomNumberGenerator(RandomNumberGenerator* rng)
  37. : rng_(rng ? rng : RandomNumberGenerator::Default()) {}
  38. HasRandomNumberGenerator::~HasRandomNumberGenerator() = default;
  39. void HasRandomNumberGenerator::SetRandomNumberGeneratorForTesting(
  40. RandomNumberGenerator* rng) {
  41. rng_ = rng;
  42. }
  43. } // namespace media