#ifdef TESTS_BUILD #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include #include "../src/Random.hpp" TEST_CASE("Random ints") { auto rand = ArbUt::Random(10); CHECK(rand.Get() == 1234817989); CHECK(rand.Get() == 1171957426); CHECK(rand.Get() == 275100647); CHECK(rand.Get() == 1033685688); CHECK(rand.Get() == 180895192); CHECK(rand.Get() == 135557292); CHECK(rand.Get() == 716914271); CHECK(rand.Get() == 1012211222); CHECK(rand.Get() == -2109244634); CHECK(rand.Get() == -1647742638); } TEST_CASE("Random ints with limit") { auto rand = ArbUt::Random(10); CHECK(rand.Get(10) == 2); CHECK(rand.Get(10) == 2); CHECK(rand.Get(10) == 0); CHECK(rand.Get(10) == 2); CHECK(rand.Get(10) == 0); CHECK(rand.Get(10) == 0); CHECK(rand.Get(10) == 1); CHECK(rand.Get(10) == 2); CHECK(rand.Get(10) == 5); CHECK(rand.Get(10) == 6); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 1); CHECK(rand.Get(2) == 1); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 1); CHECK(rand.Get(2) == 0); } TEST_CASE("Random ints with upper and bottom") { auto rand = ArbUt::Random(10); CHECK(rand.Get(10, 30) == 15); CHECK(rand.Get(10, 30) == 15); CHECK(rand.Get(10, 30) == 11); CHECK(rand.Get(10, 30) == 14); CHECK(rand.Get(10, 30) == 10); CHECK(rand.Get(10, 30) == 10); CHECK(rand.Get(10, 30) == 13); CHECK(rand.Get(10, 30) == 14); CHECK(rand.Get(10, 30) == 20); CHECK(rand.Get(10, 30) == 22); } TEST_CASE("Random distribution (max 0, min 1)") { auto rand = ArbUt::Random(10); const int size = 100000; int arr[size]; for (size_t i = 0; i < size; i++) { arr[i] = rand.Get(0, 1); } for (size_t i = 0; i < size; i++) { if (arr[i] != 0) FAIL("We expected a value of 0 here, but got a " << std::to_string(arr[i])); } } TEST_CASE("Random distribution (max 0, min 2)") { auto rand = ArbUt::Random(10); const int size = 100000; int arr[size]; for (size_t i = 0; i < size; i++) { arr[i] = rand.Get(0, 2); } auto numZeros = 0; auto numOnes = 0; for (size_t i = 0; i < size; i++) { if (arr[i] != 0 && arr[i] != 1) FAIL("We expected a value of 0 or 1 here, but got a " << std::to_string(arr[i])); if (arr[i] == 0) numZeros++; else numOnes++; } auto div = static_cast(numZeros) / static_cast(numOnes); INFO("Distribution: " << numZeros << "/" << numOnes); CHECK(doctest::Approx(div).epsilon(0.01) == 1); } TEST_CASE("Random distribution (max 0, min 3)") { auto rand = ArbUt::Random(10); const size_t size = 100000; int arr[size]; for (size_t i = 0; i < size; i++) { arr[i] = rand.Get(0, 3); } auto numZeros = 0; auto numOnes = 0; auto numTwos = 0; for (size_t i = 0; i < size; i++) { if (arr[i] != 0 && arr[i] != 1 && arr[i] != 2) FAIL("We expected a value between 0 and 2 here, but got a " << std::to_string(arr[i])); if (arr[i] == 0) numZeros++; else if (arr[i] == 1) numOnes++; else numTwos++; } INFO("Distribution: " << numZeros << "/" << numOnes << "/" << numTwos); CHECK(doctest::Approx(static_cast(numZeros) / static_cast(numOnes)).epsilon(0.01) == 1); CHECK(doctest::Approx(static_cast(numZeros) / static_cast(numTwos)).epsilon(0.01) == 1); CHECK(doctest::Approx(static_cast(numOnes) / static_cast(numTwos)).epsilon(0.01) == 1); } #endif