#ifndef lint static const char RCSid[] = "$Id: urand.c,v 2.10 2006/04/05 06:22:56 greg Exp $"; #endif /* * Anticorrelated random function due to Christophe Schlick */ #include "copyright.h" #include #include "standard.h" #include "random.h" #undef initurand #define MAXORDER (8*sizeof(unsigned short)) static unsigned short empty_tab = 0; unsigned short *urperm = &empty_tab; /* urand() permutation */ int urmask = 0; /* bits used in permutation */ int initurand(size) /* initialize urand() for size entries */ int size; { int order, n; register int i, offset; if ((urperm != NULL) & (urperm != &empty_tab)) free((void *)urperm); if (--size <= 0) { empty_tab = 0; urperm = &empty_tab; urmask = 0; return(0); } for (i = 1; (size >>= 1); i++) if (i == MAXORDER) break; order = i; urmask = (1< 0) hval ^= *d++ * tab[n&7]; return(hval & 0x7fffffff); }