| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- //
- // distribution_test.cxx
- // shared_random_generator-test
- //
- // Created by Sam Jaffe on 3/25/23.
- // Copyright © 2023 Sam Jaffe. All rights reserved.
- //
- #include <random/distribution.h>
- #include <random/random.h>
- #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) {
- EXPECT_THAT(to_string(Uniform(0, 10)), "iUniform[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) {
- EXPECT_THAT(to_string(Uniform(0., 10.)), "dUniform[0,10)");
- }
|