#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include "CUnit/Test.h"
#include "dds/ddsrt/random.h"
#define N_PRNG 4
#define N_DATA 10
CU_Test(ddsrt_random, mt19937)
{
static const uint32_t refdata[N_DATA] = {
3499211612u, 581869302u, 3890346734u, 3586334585u, 545404204u,
4161255391u, 3922919429u, 949333985u, 2715962298u, 1323567403u
};
ddsrt_prng_t prng;
ddsrt_prng_init_simple (&prng, 5489U);
for (size_t i = 0; i < N_DATA; i++)
{
uint32_t x = ddsrt_prng_random (&prng);
CU_ASSERT_EQ_FATAL (x, refdata[i]);
}
}
CU_Test(ddsrt_random, makeseed)
{
ddsrt_prng_seed_t seeds[N_PRNG];
memset (seeds, 0, sizeof (seeds));
for (size_t i = 0; i < N_PRNG; i++)
{
bool ok = ddsrt_prng_makeseed (&seeds[i]);
CU_ASSERT_FATAL (ok);
}
for (size_t i = 0; i < N_PRNG; i++)
{
for (size_t j = i + 1; j < N_PRNG; j++)
CU_ASSERT_NEQ_FATAL (memcmp (&seeds[i], &seeds[j], sizeof (seeds[i])), 0);
}
ddsrt_prng_t prngs[N_PRNG];
uint32_t data[N_PRNG][N_DATA];
memset (data, 0, sizeof (data));
for (size_t i = 0; i < N_PRNG; i++)
{
ddsrt_prng_init (&prngs[i], &seeds[i]);
for (size_t j = 0; j < N_DATA; j++)
data[i][j] = ddsrt_prng_random (&prngs[i]);
}
for (size_t i = 0; i < N_PRNG; i++)
{
for (size_t j = i + 1; j < N_PRNG; j++)
CU_ASSERT_NEQ_FATAL (memcmp (&data[i], &data[j], sizeof (data[i])), 0);
}
}
CU_Test(ddsrt_random, default_random)
{
#define N_BINS 128
#define N_PER_BIN 100
uint32_t bins[N_BINS];
memset (bins, 0, sizeof (bins));
for (size_t i = 0; i < N_PER_BIN * N_BINS; i++)
{
uint32_t x = ddsrt_random ();
bins[x % N_BINS]++;
}
double chisq = 0.0;
for (size_t i = 0; i < N_BINS; i++)
chisq += ((bins[i] - N_PER_BIN) * (bins[i] - N_PER_BIN)) / (double) N_PER_BIN;
CU_ASSERT_LT (chisq, 181.993);
}