#include "../Tests.h" #include "core/Random.h" static void testAverage(bool light) { int limit = light ? 100000 : 1000000; Random r; initRandom(&r, 553); float sum = 0; for(int i = 0; i < limit; i++) { u32 u = randomU32(&r, 2, 11); sum += (float)u; } sum /= (float)limit; TEST_FLOAT(6.0f, sum, 0.01f); } static void testCoin(bool light) { int limit = light ? 100000 : 1000000; Random r; initRandom(&r, 5533); int c[2] = {0, 0}; for(int i = 0; i < limit; i++) { c[randomBool(&r)]++; } TEST_FLOAT(0.0f, (float)(c[0] - c[1]) / (float)limit, 0.003f); } static void testDistribution(bool light) { size_t limit = light ? 100000 : 1000000; Random r; initRandom(&r, 553); int c[102] = {0}; for(size_t i = 0; i < limit; i++) { c[randomSize(&r, 1, 101)]++; } TEST_INT(0, c[0]); TEST_INT(0, c[101]); for(size_t i = 1; i < 101; i++) { TEST_FLOAT(0.01f, (float)c[i] / (float)limit, 0.001f); } } static void testFloatAverage(bool light) { int limit = light ? 100000 : 1000000; Random r; initRandom(&r, 553); float sum = 0; for(int i = 0; i < limit; i++) { sum += randomFloat(&r); } sum /= (float)limit; TEST_FLOAT(0.5f, sum, 0.001f); } static void testFloatCoin(bool light) { int limit = light ? 100000 : 1000000; Random r; initRandom(&r, 5534); int c[2] = {0, 0}; for(int i = 0; i < limit; i++) { c[randomFloat(&r) < 0.5f]++; } TEST_FLOAT(0.0f, (float)(c[0] - c[1]) / (float)limit, 0.003f); } static void testFloatDistribution(bool light) { int limit = light ? 100000 : 1000000; Random r; initRandom(&r, 553); int c[102] = {0}; for(int i = 0; i < limit; i++) { c[(size_t)(1.0f + randomFloat(&r) * 100.0f)]++; } TEST_INT(0, c[0]); TEST_INT(0, c[101]); for(size_t i = 1; i < 101; i++) { TEST_FLOAT(0.01f, (float)c[i] / (float)limit, 0.003f); } } static void testRandomI32() { Random r; initRandom(&r, 56346); int c[7] = {0}; for(int i = 0; i < 10000; i++) { i32 index = randomI32(&r, -2, 3) + 3; if(TEST_TRUE(index >= 0 && index < 7)) { c[index]++; } } for(size_t i = 0; i < 7; i++) { TEST_BOOL(i != 0 && i != 6, c[i] > 0); } } void testRandom(bool light) { testAverage(light); testCoin(light); testDistribution(light); testFloatAverage(light); testFloatCoin(light); testFloatDistribution(light); testRandomI32(); }