1*3e12c5d1SDavid du Colombier #define _RESEARCH_SOURCE 2*3e12c5d1SDavid du Colombier #include <stdlib.h> 3*3e12c5d1SDavid du Colombier #include <libv.h> 4*3e12c5d1SDavid du Colombier /* 5*3e12c5d1SDavid du Colombier random number generator from cacm 31 10, oct 88 6*3e12c5d1SDavid du Colombier for 32 bit integers (called long here) 7*3e12c5d1SDavid du Colombier */ 8*3e12c5d1SDavid du Colombier 9*3e12c5d1SDavid du Colombier #ifdef MAIN 10*3e12c5d1SDavid du Colombier #define A 16807 11*3e12c5d1SDavid du Colombier #define M 2147483647 12*3e12c5d1SDavid du Colombier #define Q 127773 13*3e12c5d1SDavid du Colombier #define R 2836 14*3e12c5d1SDavid du Colombier #else 15*3e12c5d1SDavid du Colombier #define A 48271 16*3e12c5d1SDavid du Colombier #define M 2147483647 17*3e12c5d1SDavid du Colombier #define Q 44488 18*3e12c5d1SDavid du Colombier #define R 3399 19*3e12c5d1SDavid du Colombier #endif 20*3e12c5d1SDavid du Colombier 21*3e12c5d1SDavid du Colombier static long seed = 1; 22*3e12c5d1SDavid du Colombier 23*3e12c5d1SDavid du Colombier void srand(unsigned int newseed)24*3e12c5d1SDavid du Colombiersrand(unsigned int newseed) 25*3e12c5d1SDavid du Colombier { 26*3e12c5d1SDavid du Colombier seed = newseed; 27*3e12c5d1SDavid du Colombier } 28*3e12c5d1SDavid du Colombier 29*3e12c5d1SDavid du Colombier long lrand(void)30*3e12c5d1SDavid du Colombierlrand(void) 31*3e12c5d1SDavid du Colombier { 32*3e12c5d1SDavid du Colombier long lo, hi, test; 33*3e12c5d1SDavid du Colombier 34*3e12c5d1SDavid du Colombier hi = seed/Q; 35*3e12c5d1SDavid du Colombier lo = seed%Q; 36*3e12c5d1SDavid du Colombier test = A*lo - R*hi; 37*3e12c5d1SDavid du Colombier if(test > 0) 38*3e12c5d1SDavid du Colombier seed = test; 39*3e12c5d1SDavid du Colombier else 40*3e12c5d1SDavid du Colombier seed = test+M; 41*3e12c5d1SDavid du Colombier return(seed); 42*3e12c5d1SDavid du Colombier } 43*3e12c5d1SDavid du Colombier 44*3e12c5d1SDavid du Colombier int rand(void)45*3e12c5d1SDavid du Colombierrand(void) 46*3e12c5d1SDavid du Colombier { 47*3e12c5d1SDavid du Colombier return lrand()%(RAND_MAX+1); 48*3e12c5d1SDavid du Colombier } 49*3e12c5d1SDavid du Colombier 50*3e12c5d1SDavid du Colombier #ifdef MAIN 51*3e12c5d1SDavid du Colombier main()52*3e12c5d1SDavid du Colombiermain() 53*3e12c5d1SDavid du Colombier { 54*3e12c5d1SDavid du Colombier int i; 55*3e12c5d1SDavid du Colombier 56*3e12c5d1SDavid du Colombier for(i = 0; i < 10000; i++) 57*3e12c5d1SDavid du Colombier rand(); 58*3e12c5d1SDavid du Colombier if(seed == 1043618065) 59*3e12c5d1SDavid du Colombier printf(" rand: pass\n"); 60*3e12c5d1SDavid du Colombier else 61*3e12c5d1SDavid du Colombier printf("*****rand: fail; seed=%u, should be 1043618065\n", seed); 62*3e12c5d1SDavid du Colombier exit(0); 63*3e12c5d1SDavid du Colombier } 64*3e12c5d1SDavid du Colombier #endif 65