Blame src/functional/random.c

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
}