|
Szabolcs Nagy |
cda5e0 |
#define _XOPEN_SOURCE 700
|
|
Szabolcs Nagy |
c706d1 |
#include <stdio.h>
|
|
Szabolcs Nagy |
c706d1 |
#include <stdlib.h>
|
|
Szabolcs Nagy |
c706d1 |
#include "test.h"
|
|
Szabolcs Nagy |
c706d1 |
|
|
Szabolcs Nagy |
c706d1 |
/* naive statistical checks */
|
|
Szabolcs Nagy |
c706d1 |
|
|
Szabolcs Nagy |
c706d1 |
/* error p ~ 1.6e-6 */
|
|
Szabolcs Nagy |
c706d1 |
static int chkmissing(long *x)
|
|
Szabolcs Nagy |
c706d1 |
{
|
|
Szabolcs Nagy |
c706d1 |
int d[8] = {0};
|
|
Szabolcs Nagy |
c706d1 |
int i;
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 100; i++)
|
|
Szabolcs Nagy |
c706d1 |
d[x[i]%8]++;
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 8; i++)
|
|
Szabolcs Nagy |
c706d1 |
if (d[i]==0)
|
|
Szabolcs Nagy |
c706d1 |
return 1;
|
|
Szabolcs Nagy |
c706d1 |
return 0;
|
|
Szabolcs Nagy |
c706d1 |
}
|
|
Szabolcs Nagy |
c706d1 |
|
|
Szabolcs Nagy |
c706d1 |
/* error p ~ 4e-6 */
|
|
Szabolcs Nagy |
c706d1 |
static int chkrepeat(long *x)
|
|
Szabolcs Nagy |
c706d1 |
{
|
|
Szabolcs Nagy |
c706d1 |
int i, j;
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 100; i++)
|
|
Szabolcs Nagy |
c706d1 |
for (j = 0; j < i; j++)
|
|
Szabolcs Nagy |
c706d1 |
if (x[i] == x[j])
|
|
Szabolcs Nagy |
c706d1 |
return 1;
|
|
Szabolcs Nagy |
c706d1 |
return 0;
|
|
Szabolcs Nagy |
c706d1 |
}
|
|
Szabolcs Nagy |
c706d1 |
|
|
Szabolcs Nagy |
c706d1 |
/* error p ~ 1e-6 */
|
|
Szabolcs Nagy |
c706d1 |
static unsigned orx;
|
|
Szabolcs Nagy |
c706d1 |
static int chkones(long *x)
|
|
Szabolcs Nagy |
c706d1 |
{
|
|
Szabolcs Nagy |
c706d1 |
int i;
|
|
Szabolcs Nagy |
c706d1 |
orx = 0;
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 20; i++)
|
|
Szabolcs Nagy |
c706d1 |
orx |= x[i];
|
|
Szabolcs Nagy |
c706d1 |
return orx != 0x7fffffff;
|
|
Szabolcs Nagy |
c706d1 |
}
|
|
Szabolcs Nagy |
c706d1 |
|
|
Szabolcs Nagy |
c706d1 |
void checkseed(unsigned seed, long *x)
|
|
Szabolcs Nagy |
c706d1 |
{
|
|
Szabolcs Nagy |
c706d1 |
int i;
|
|
Szabolcs Nagy |
c706d1 |
srandom(seed);
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 100; i++)
|
|
Szabolcs Nagy |
c706d1 |
x[i] = random();
|
|
Szabolcs Nagy |
c706d1 |
if (chkmissing(x))
|
|
Szabolcs Nagy |
c706d1 |
t_error("weak seed %d, missing pattern in low bits\n", seed);
|
|
Szabolcs Nagy |
c706d1 |
if (chkrepeat(x))
|
|
Szabolcs Nagy |
c706d1 |
t_error("weak seed %d, exact repeats\n", seed);
|
|
Szabolcs Nagy |
c706d1 |
if (chkones(x))
|
|
Szabolcs Nagy |
c706d1 |
t_error("weak seed %d, or pattern: 0x%08x\n", seed, orx);
|
|
Szabolcs Nagy |
c706d1 |
}
|
|
Szabolcs Nagy |
c706d1 |
|
|
Szabolcs Nagy |
c706d1 |
int main()
|
|
Szabolcs Nagy |
c706d1 |
{
|
|
Szabolcs Nagy |
c706d1 |
long x[100];
|
|
Szabolcs Nagy |
c706d1 |
long y,z;
|
|
Szabolcs Nagy |
c706d1 |
int i;
|
|
Szabolcs Nagy |
c706d1 |
char state[128];
|
|
Szabolcs Nagy |
c706d1 |
char *p;
|
|
Szabolcs Nagy |
c706d1 |
char *q;
|
|
Szabolcs Nagy |
c706d1 |
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 100; i++)
|
|
Szabolcs Nagy |
c706d1 |
x[i] = random();
|
|
Szabolcs Nagy |
c706d1 |
p = initstate(1, state, sizeof state);
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 100; i++)
|
|
Szabolcs Nagy |
c706d1 |
if (x[i] != (y = random()))
|
|
Szabolcs Nagy |
c706d1 |
t_error("initstate(1) is not default: (%d) default: %ld, seed1: %ld\n", i, x[i], y);
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 10; i++) {
|
|
Szabolcs Nagy |
c706d1 |
z = random();
|
|
Szabolcs Nagy |
c706d1 |
q = setstate(p);
|
|
Szabolcs Nagy |
c706d1 |
if (z != (y = random()))
|
|
Szabolcs Nagy |
c706d1 |
t_error("setstate failed (%d) orig: %ld, reset: %ld\n", i, z, y);
|
|
Szabolcs Nagy |
c706d1 |
p = setstate(q);
|
|
Szabolcs Nagy |
c706d1 |
}
|
|
Szabolcs Nagy |
c706d1 |
srandom(1);
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 100; i++)
|
|
Szabolcs Nagy |
c706d1 |
if (x[i] != (y = random()))
|
|
Szabolcs Nagy |
c706d1 |
t_error("srandom(1) is not default: (%d) default: %ld, seed1: %ld\n", i, x[i], y);
|
|
Szabolcs Nagy |
c706d1 |
checkseed(0x7fffffff, x);
|
|
Szabolcs Nagy |
c706d1 |
for (i = 0; i < 10; i++)
|
|
Szabolcs Nagy |
c706d1 |
checkseed(i, x);
|
|
Szabolcs Nagy |
c706d1 |
return t_status;
|
|
Szabolcs Nagy |
c706d1 |
}
|