#include "../Tests.hpp" #include "core/Random.hpp" #include "core/Test.hpp" using Core::Random; static void testAverage(bool light) { int limit = light ? 100'000 : 1'000'000; Random r(553); float sum = 0; for(int i = 0; i < limit; i++) { sum += static_cast(r.nextU32(2, 11)); } sum /= static_cast(limit); TEST_FLOAT(6.0f, sum, 0.01f); } static void testCoin(bool light) { int limit = light ? 100'000 : 1'000'000; Random r(5533); int c[2] = {0, 0}; for(int i = 0; i < limit; i++) { c[r.nextBool()]++; } TEST_FLOAT( 0.0f, static_cast(c[0] - c[1]) / static_cast(limit), 0.003f); } static void testDistribution(bool light) { size_t limit = light ? 100'000 : 1'000'000; Random r(553); Core::Array c; for(size_t i = 0; i < limit; i++) { c[r.nextSize(1, c.getLength() - 1)]++; } TEST(0, c[0]); TEST(0, c[c.getLength() - 1]); for(size_t i = 1; i < c.getLength() - 1; i++) { TEST_FLOAT( 0.01f, static_cast(c[i]) / static_cast(limit), 0.001f); } } static void testFloatAverage(bool light) { int limit = light ? 100'000 : 1'000'000; Core::Random r(553); float sum = 0; for(int i = 0; i < limit; i++) { sum += r.nextFloat(); } sum /= static_cast(limit); TEST_FLOAT(0.5f, sum, 0.001f); } static void testFloatCoin(bool light) { int limit = light ? 100'000 : 1'000'000; Random r(5535); Core::Array c; for(int i = 0; i < limit; i++) { c[r.nextFloat() < 0.5f]++; } TEST_FLOAT( 0.0f, static_cast(c[0] - c[1]) / static_cast(limit), 0.003f); } static void testFloatDistribution(bool light) { int limit = light ? 100'000 : 1'000'000; Random r(553); Core::Array c; for(int i = 0; i < limit; i++) { c[static_cast(1.0f + r.nextFloat() * (c.getLength() - 2))]++; } TEST(0, c[0]); TEST(0, c[c.getLength() - 1]); for(size_t i = 1; i < c.getLength() - 1; i++) { TEST_FLOAT( 0.01f, static_cast(c[i]) / static_cast(limit), 0.003f); } } static void testRandomI32() { Random r(56'346); Core::Array c; c.fill(0); for(int i = 0; i < 10'000; i++) { i32 index = r.nextI32(-2, 3) + 3; if(TEST_TRUE(index >= 0)) { c[static_cast(index)]++; } } for(size_t i = 0; i < c.getLength(); i++) { TEST(i != 0 && i != c.getLength() - 1, c[i] > 0); } } void testRandom(bool light) { testAverage(light); testCoin(light); testDistribution(light); testFloatAverage(light); testFloatCoin(light); testFloatDistribution(light); testRandomI32(); }