cloud-sat/kissat-inc/test/testrandom.c
2023-03-26 19:15:17 +08:00

107 lines
3.4 KiB
C

#include "test.h"
#include "../src/random.h"
static void
test_random_range (void)
{
srand (42);
generator random;
const unsigned rounds = (tissat_big ? 100 : 10);
for (unsigned seed = 0; seed < rounds; seed++)
{
#define M 100
random = seed;
printf ("seed %u\n", seed);
unsigned count[M];
const unsigned L = rand () % 1000;
const unsigned R = L + (rand () % M) + 1;
const unsigned D = R - L;
const unsigned N = 1000 * D;
printf ("generating %u in the range [%u..%u) of size %u\n", N, L, R, D);
const unsigned expected = N / D;
assert (expected > 0);
const double percent = 20;
unsigned epsilon = percent / 100 * expected;
if (!epsilon)
epsilon = 1;
assert (epsilon <= expected);
printf ("expected %u epsilon %u = %.0f %% of %u (%u .. %u)\n",
expected, epsilon, percent, expected,
expected - epsilon, expected + epsilon);
memset (count, 0, sizeof count);
for (unsigned i = 0; i < N; i++)
{
const unsigned picked = kissat_pick_random (&random, L, R);
assert (L <= picked), assert (picked < R);
count[picked - L]++;
}
unsigned min = UINT_MAX, max = 0;
for (unsigned i = L; i < R; i++)
{
const unsigned tmp = count[i - L];
max = MAX (tmp, max);
min = MIN (tmp, min);
printf ("count[%u] = %u\n", i, tmp);
}
printf ("min %u, max %u, range %.0f%%\n",
min, max, 100.0 * (max - min + 1) / expected);
for (unsigned i = L; i < R; i++)
if (count[i - L] < expected - epsilon)
FATAL ("count[%u] = %u but expected at least %u = %u - %u",
i, count[i - L], expected - epsilon, expected, epsilon);
else if (count[i - L] > expected + epsilon)
FATAL ("count[%u] = %u but expected at most %u = %u + %u",
i, count[i - L], expected + epsilon, expected, epsilon);
}
}
static void
test_random_bool (void)
{
generator random;
const unsigned rounds = (tissat_big ? 100 : 10);
for (unsigned seed = 0; seed < rounds; seed++)
{
random = seed;
printf ("seed %u\n", seed);
unsigned count[2];
const unsigned N = 10000;
printf ("generating %u random Boolean numbers\n", N);
const unsigned expected = N / 2;
assert (expected > 0);
const double percent = 10;
unsigned epsilon = percent / 100 * expected;
assert (epsilon);
printf ("expected %u epsilon %u = %.0f %% of %u (%u .. %u)\n",
expected, epsilon, percent, expected,
expected - epsilon, expected + epsilon);
memset (count, 0, sizeof count);
for (unsigned i = 0; i < N; i++)
{
const bool picked = kissat_pick_bool (&random);
count[picked]++;
}
for (unsigned i = 0; i < 2; i++)
printf ("count[%u] = %u\n", i, count[i]);
unsigned min = MIN (count[0], count[1]);
unsigned max = MAX (count[0], count[1]);
printf ("min %u, max %u, range %.0f%%\n",
min, max, 100.0 * (max - min + 1) / expected);
for (unsigned i = 0; i < 2; i++)
if (count[i] < expected - epsilon)
FATAL ("count[%u] = %u but expected at least %u = %u - %u",
i, count[i], expected - epsilon, expected, epsilon);
else if (count[i] > expected + epsilon)
FATAL ("count[%u] = %u but expected at most %u = %u + %u",
i, count[i], expected + epsilon, expected, epsilon);
}
}
void
tissat_schedule_random (void)
{
SCHEDULE_FUNCTION (test_random_range);
SCHEDULE_FUNCTION (test_random_bool);
}