distribution_test.cxx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. std::stringstream ss;
  43. ss << Uniform(0, 10);
  44. EXPECT_THAT(ss.str(), "Uniform[0,10]");
  45. }
  46. TEST(UniformRealTest, UniformOnDefaultRandom) {
  47. Random generator{};
  48. kahan_summation sum{};
  49. size_t const iters = 2000000;
  50. for (size_t i = 0; i < iters; ++i) {
  51. // All values from 0 - 99 are allowable
  52. sum += generator(Uniform(0.0, 100.0));
  53. }
  54. // Expected result is [0.0, 100.0) +/- 0.1%
  55. EXPECT_THAT(double(sum) / iters, DoubleNear(50, 0.05));
  56. }
  57. TEST(UniformRealTest, IsOpen) {
  58. std::stringstream ss;
  59. ss << Uniform(0.0, 10.0);
  60. EXPECT_THAT(ss.str(), "Uniform[0,10)");
  61. }