distribution_test.cxx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //
  2. // distribution_test.cxx
  3. // shared_random_generator-test
  4. //
  5. // Created by Sam Jaffe on 3/25/23.
  6. // Copyright © 2023 Sam Jaffe. All rights reserved.
  7. //
  8. #include <random/distribution.h>
  9. #include <random/random.h>
  10. #include "xcode_gtest_helper.h"
  11. using testing::DoubleNear;
  12. using engine::random::Random;
  13. using engine::random::Uniform;
  14. class kahan_summation {
  15. private:
  16. double sum_{0.0};
  17. double carry_{0.0};
  18. public:
  19. kahan_summation() = default;
  20. kahan_summation & operator+=(double d);
  21. explicit operator double() const { return sum_; }
  22. };
  23. kahan_summation & kahan_summation::operator+=(double num) {
  24. double const yield = num - carry_;
  25. double const total = sum_ + yield;
  26. carry_ = (total - sum_) - yield;
  27. sum_ = total;
  28. return *this;
  29. }
  30. TEST(UniformIntTest, UniformOnDefaultRandom) {
  31. Random generator{};
  32. kahan_summation sum{};
  33. size_t const iters = 2000000;
  34. for (size_t i = 0; i < iters; ++i) {
  35. // All values from 0 - 100 are allowable
  36. sum += generator(Uniform(0, 100));
  37. }
  38. // Expected result is (0+99)/2 +/- 0.1%
  39. EXPECT_THAT(double(sum) / iters, DoubleNear(50, 0.05));
  40. }
  41. TEST(UniformIntTest, IsClosed) {
  42. EXPECT_THAT(to_string(Uniform(0, 10)), "iUniform[0,10]");
  43. }
  44. TEST(UniformRealTest, UniformOnDefaultRandom) {
  45. Random generator{};
  46. kahan_summation sum{};
  47. size_t const iters = 2000000;
  48. for (size_t i = 0; i < iters; ++i) {
  49. // All values from 0 - 99 are allowable
  50. sum += generator(Uniform(0.0, 100.0));
  51. }
  52. // Expected result is [0.0, 100.0) +/- 0.1%
  53. EXPECT_THAT(double(sum) / iters, DoubleNear(50, 0.05));
  54. }
  55. TEST(UniformRealTest, IsOpen) {
  56. EXPECT_THAT(to_string(Uniform(0., 10.)), "dUniform[0,10)");
  57. }