00001 00008 //#include <stdlib.h> 00009 00011 // 00012 // Definitions 00013 // 00015 00016 #define PRANDOM_SLOTS 16 00017 #define PRANDOM_MASK 0x3fc91ab4 00018 00019 #define PRANDOM_A 16807 00020 #define PRANDOM_M 2147483647 00021 #define PRANDOM_Q 127773 00022 #define PRANDOM_R 2836 00023 00024 00026 typedef struct { 00027 long select; 00028 long state; 00029 long entry[PRANDOM_SLOTS]; 00030 } prandom_t; 00031 00032 00034 // 00035 // Static variables 00036 // 00038 00039 static prandom_t generator; 00040 00041 00043 // 00044 // Global functions 00045 // 00047 00049 void randstep(long *val) { 00050 long k; 00051 k=(*val)/PRANDOM_Q; 00052 *val=PRANDOM_A*(*val-k*PRANDOM_Q)-PRANDOM_R*k; 00053 if(*val<0) 00054 *val += PRANDOM_M; 00055 } 00056 00058 void srandom(unsigned _seed) { 00059 unsigned i; 00060 unsigned long seed=_seed; 00061 00062 // catch zero seeds etc. 00063 seed= (seed==PRANDOM_MASK) ? seed : seed^PRANDOM_MASK; 00064 00065 // initialize array. 00066 randstep(&seed); 00067 generator.select=seed & (PRANDOM_SLOTS-1); 00068 for(i=0; i<PRANDOM_SLOTS; i++) { 00069 randstep(&seed); 00070 generator.entry[i]=seed; 00071 } 00072 randstep(&seed); 00073 generator.state=seed; 00074 } 00075 00077 long random() { 00078 long res=generator.entry[generator.select]; 00079 00080 randstep(&generator.state); 00081 generator.entry[generator.select]=generator.state; 00082 generator.select=res & (PRANDOM_SLOTS-1); 00083 00084 return res; 00085 }