| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 | #ifdef ZX81_RNG/* * This is my favorite tiny RNG, If you had a ZX81 you may recognise it :-) *								(RdeBath) */#include <stdlib.h>#define MAXINT (((unsigned)-1)>>1)static unsigned int sseed = 0;int rand(){	return (sseed = (((sseed + 1L) * 75L) % 65537L) - 1) & MAXINT;}void srand(seed)unsigned int seed;{	sseed = seed;}#else/* * This generator is a combination of three linear congruential generators * with periods or 2^15-405, 2^15-1041 and 2^15-1111. It has a period that * is the product of these three numbers. */static int seed1 = 1;static int seed2 = 1;static int seed3 = 1;#define MAXINT (((unsigned)-1)>>1)#define CRANK(a,b,c,m,s) 	\	q = s/a;		\	s = b*(s-a*q) - c*q;	\	if(s<0) s+=m;int rand(){	register int q;	CRANK(206, 157, 31, 32363, seed1);	CRANK(217, 146, 45, 31727, seed2);	CRANK(222, 142, 133, 31657, seed3);	return seed1 ^ seed2 ^ seed3;}void srand(seed)unsigned int seed;{	seed &= MAXINT;	seed1 = seed % 32362 + 1;	seed2 = seed % 31726 + 1;	seed3 = seed % 31656 + 1;}#endif
 |