diff --git a/src/functional/random.c b/src/functional/random.c new file mode 100644 index 0000000..65bbf28 --- /dev/null +++ b/src/functional/random.c @@ -0,0 +1,86 @@ +#include +#include +#include "test.h" + +/* naive statistical checks */ + +/* error p ~ 1.6e-6 */ +static int chkmissing(long *x) +{ + int d[8] = {0}; + int i; + for (i = 0; i < 100; i++) + d[x[i]%8]++; + for (i = 0; i < 8; i++) + if (d[i]==0) + return 1; + return 0; +} + +/* error p ~ 4e-6 */ +static int chkrepeat(long *x) +{ + int i, j; + for (i = 0; i < 100; i++) + for (j = 0; j < i; j++) + if (x[i] == x[j]) + return 1; + return 0; +} + +/* error p ~ 1e-6 */ +static unsigned orx; +static int chkones(long *x) +{ + int i; + orx = 0; + for (i = 0; i < 20; i++) + orx |= x[i]; + return orx != 0x7fffffff; +} + +void checkseed(unsigned seed, long *x) +{ + int i; + srandom(seed); + for (i = 0; i < 100; i++) + x[i] = random(); + if (chkmissing(x)) + t_error("weak seed %d, missing pattern in low bits\n", seed); + if (chkrepeat(x)) + t_error("weak seed %d, exact repeats\n", seed); + if (chkones(x)) + t_error("weak seed %d, or pattern: 0x%08x\n", seed, orx); +} + +int main() +{ + long x[100]; + long y,z; + int i; + char state[128]; + char *p; + char *q; + + for (i = 0; i < 100; i++) + x[i] = random(); + p = initstate(1, state, sizeof state); + for (i = 0; i < 100; i++) + if (x[i] != (y = random())) + t_error("initstate(1) is not default: (%d) default: %ld, seed1: %ld\n", i, x[i], y); + for (i = 0; i < 10; i++) { + z = random(); + q = setstate(p); + if (z != (y = random())) + t_error("setstate failed (%d) orig: %ld, reset: %ld\n", i, z, y); + p = setstate(q); + } + srandom(1); + for (i = 0; i < 100; i++) + if (x[i] != (y = random())) + t_error("srandom(1) is not default: (%d) default: %ld, seed1: %ld\n", i, x[i], y); + checkseed(0x7fffffff, x); + for (i = 0; i < 10; i++) + checkseed(i, x); + return t_status; +}