Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

random.c

Go to the documentation of this file.
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 }

Generated on Fri Feb 25 08:02:39 2005 for brickos by  doxygen 1.3.9.1