#include "../Tests.hpp" #include "core/data/Array.hpp" #include "core/utils/Random.hpp" static void testAverage(bool light) { int limit = light ? 100000 : 1000000; Core::Random r(553); float sum = 0; for(int i = 0; i < limit; i++) { sum += static_cast(r.next(2, 10)); } sum /= static_cast(limit); CORE_TEST_FLOAT(6.0f, sum, 0.01f); } static void testCoin(bool light) { int limit = light ? 100000 : 1000000; Core::Random r(5533); Core::Array c(0); for(int i = 0; i < limit; i++) { c[r.nextBool()]++; } CORE_TEST_FLOAT(0.0f, static_cast(c[0] - c[1]) / static_cast(limit), 0.003f); } static void testDistribution(bool light) { size_t limit = light ? 100000 : 1000000; Core::Random r(553); Core::Array c(0); for(size_t i = 0; i < limit; i++) { c[r.nextSize(1, c.getLength() - 2)]++; } CORE_TEST_EQUAL(0, c[0]); CORE_TEST_EQUAL(0, c[c.getLength() - 1]); for(size_t i = 1; i < c.getLength() - 1; i++) { CORE_TEST_FLOAT(0.01f, static_cast(c[i]) / static_cast(limit), 0.001f); } } static void testFloatAverage(bool light) { int limit = light ? 100000 : 1000000; Core::Random r(553); float sum = 0; for(int i = 0; i < limit; i++) { sum += r.nextFloat(); } sum /= static_cast(limit); CORE_TEST_FLOAT(0.5f, sum, 0.001f); } static void testFloatCoin(bool light) { int limit = light ? 100000 : 1000000; Core::Random r(5534); Core::Array c(0); for(int i = 0; i < limit; i++) { c[r.nextFloat() < 0.5f]++; } CORE_TEST_FLOAT(0.0f, static_cast(c[0] - c[1]) / static_cast(limit), 0.003f); } static void testFloatDistribution(bool light) { int limit = light ? 100000 : 1000000; Core::Random r(553); Core::Array c(0); for(int i = 0; i < limit; i++) { c[static_cast(r.nextFloat(1.0f, c.getLength() - 1))]++; } CORE_TEST_EQUAL(0, c[0]); CORE_TEST_EQUAL(0, c[c.getLength() - 1]); for(size_t i = 1; i < c.getLength() - 1; i++) { CORE_TEST_FLOAT(0.01f, static_cast(c[i]) / static_cast(limit), 0.003f); } } static void testRandomI32() { Core::Random r(56346); Core::Array c; c.fill(0); for(int i = 0; i < 10'000; i++) { i32 index = r.nextI32(-2, 2) + 3; if(CORE_TEST_TRUE(index >= 0)) { c[static_cast(index)]++; } } for(size_t i = 0; i < c.getLength(); i++) { CORE_TEST_EQUAL(i != 0 && i != c.getLength() - 1, c[i] > 0); } } void Core::testRandom(bool light) { testAverage(light); testCoin(light); testDistribution(light); testFloatAverage(light); testFloatCoin(light); testFloatDistribution(light); testRandomI32(); }