// // distribution_test.cxx // shared_random_generator-test // // Created by Sam Jaffe on 3/25/23. // Copyright © 2023 Sam Jaffe. All rights reserved. // #include #include #include "xcode_gtest_helper.h" using testing::DoubleNear; using engine::random::Random; using engine::random::Uniform; class kahan_summation { private: double sum_{0.0}; double carry_{0.0}; public: kahan_summation() = default; kahan_summation & operator+=(double d); explicit operator double() const { return sum_; } }; kahan_summation & kahan_summation::operator+=(double num) { double const yield = num - carry_; double const total = sum_ + yield; carry_ = (total - sum_) - yield; sum_ = total; return *this; } TEST(UniformIntTest, UniformOnDefaultRandom) { Random generator{}; kahan_summation sum{}; size_t const iters = 2000000; for (size_t i = 0; i < iters; ++i) { // All values from 0 - 100 are allowable sum += generator(Uniform(0, 100)); } // Expected result is (0+99)/2 +/- 0.1% EXPECT_THAT(double(sum) / iters, DoubleNear(50, 0.05)); } TEST(UniformIntTest, IsClosed) { std::stringstream ss; ss << Uniform(0, 10); EXPECT_THAT(ss.str(), "Uniform[0,10]"); } TEST(UniformRealTest, UniformOnDefaultRandom) { Random generator{}; kahan_summation sum{}; size_t const iters = 2000000; for (size_t i = 0; i < iters; ++i) { // All values from 0 - 99 are allowable sum += generator(Uniform(0.0, 100.0)); } // Expected result is [0.0, 100.0) +/- 0.1% EXPECT_THAT(double(sum) / iters, DoubleNear(50, 0.05)); } TEST(UniformRealTest, IsOpen) { std::stringstream ss; ss << Uniform(0.0, 10.0); EXPECT_THAT(ss.str(), "Uniform[0,10)"); }