1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #if defined(LIBC_SCCS) && !defined(lint) 9 static char sccsid[] = "@(#)random.c 5.8 (Berkeley) 02/23/91"; 10 #endif /* LIBC_SCCS and not lint */ 11 12 #include <stdio.h> 13 #include <stdlib.h> 14 15 /* 16 * random.c: 17 * An improved random number generation package. In addition to the standard 18 * rand()/srand() like interface, this package also has a special state info 19 * interface. The initstate() routine is called with a seed, an array of 20 * bytes, and a count of how many bytes are being passed in; this array is then 21 * initialized to contain information for random number generation with that 22 * much state information. Good sizes for the amount of state information are 23 * 32, 64, 128, and 256 bytes. The state can be switched by calling the 24 * setstate() routine with the same array as was initiallized with initstate(). 25 * By default, the package runs with 128 bytes of state information and 26 * generates far better random numbers than a linear congruential generator. 27 * If the amount of state information is less than 32 bytes, a simple linear 28 * congruential R.N.G. is used. 29 * Internally, the state information is treated as an array of longs; the 30 * zeroeth element of the array is the type of R.N.G. being used (small 31 * integer); the remainder of the array is the state information for the 32 * R.N.G. Thus, 32 bytes of state information will give 7 longs worth of 33 * state information, which will allow a degree seven polynomial. (Note: the 34 * zeroeth word of state information also has some other information stored 35 * in it -- see setstate() for details). 36 * The random number generation technique is a linear feedback shift register 37 * approach, employing trinomials (since there are fewer terms to sum up that 38 * way). In this approach, the least significant bit of all the numbers in 39 * the state table will act as a linear feedback shift register, and will have 40 * period 2^deg - 1 (where deg is the degree of the polynomial being used, 41 * assuming that the polynomial is irreducible and primitive). The higher 42 * order bits will have longer periods, since their values are also influenced 43 * by pseudo-random carries out of the lower bits. The total period of the 44 * generator is approximately deg*(2**deg - 1); thus doubling the amount of 45 * state information has a vast influence on the period of the generator. 46 * Note: the deg*(2**deg - 1) is an approximation only good for large deg, 47 * when the period of the shift register is the dominant factor. With deg 48 * equal to seven, the period is actually much longer than the 7*(2**7 - 1) 49 * predicted by this formula. 50 */ 51 52 53 54 /* 55 * For each of the currently supported random number generators, we have a 56 * break value on the amount of state information (you need at least this 57 * many bytes of state info to support this random number generator), a degree 58 * for the polynomial (actually a trinomial) that the R.N.G. is based on, and 59 * the separation between the two lower order coefficients of the trinomial. 60 */ 61 62 #define TYPE_0 0 /* linear congruential */ 63 #define BREAK_0 8 64 #define DEG_0 0 65 #define SEP_0 0 66 67 #define TYPE_1 1 /* x**7 + x**3 + 1 */ 68 #define BREAK_1 32 69 #define DEG_1 7 70 #define SEP_1 3 71 72 #define TYPE_2 2 /* x**15 + x + 1 */ 73 #define BREAK_2 64 74 #define DEG_2 15 75 #define SEP_2 1 76 77 #define TYPE_3 3 /* x**31 + x**3 + 1 */ 78 #define BREAK_3 128 79 #define DEG_3 31 80 #define SEP_3 3 81 82 #define TYPE_4 4 /* x**63 + x + 1 */ 83 #define BREAK_4 256 84 #define DEG_4 63 85 #define SEP_4 1 86 87 88 /* 89 * Array versions of the above information to make code run faster -- relies 90 * on fact that TYPE_i == i. 91 */ 92 93 #define MAX_TYPES 5 /* max number of types above */ 94 95 static int degrees[ MAX_TYPES ] = { DEG_0, DEG_1, DEG_2, 96 DEG_3, DEG_4 }; 97 98 static int seps[ MAX_TYPES ] = { SEP_0, SEP_1, SEP_2, 99 SEP_3, SEP_4 }; 100 101 102 103 /* 104 * Initially, everything is set up as if from : 105 * initstate( 1, &randtbl, 128 ); 106 * Note that this initialization takes advantage of the fact that srandom() 107 * advances the front and rear pointers 10*rand_deg times, and hence the 108 * rear pointer which starts at 0 will also end up at zero; thus the zeroeth 109 * element of the state information, which contains info about the current 110 * position of the rear pointer is just 111 * MAX_TYPES*(rptr - state) + TYPE_3 == TYPE_3. 112 */ 113 114 static long randtbl[ DEG_3 + 1 ] = { TYPE_3, 115 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, 116 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, 117 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, 118 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 119 0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, 120 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, 121 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 122 0xf5ad9d0e, 0x8999220b, 0x27fb47b9 }; 123 124 /* 125 * fptr and rptr are two pointers into the state info, a front and a rear 126 * pointer. These two pointers are always rand_sep places aparts, as they cycle 127 * cyclically through the state information. (Yes, this does mean we could get 128 * away with just one pointer, but the code for random() is more efficient this 129 * way). The pointers are left positioned as they would be from the call 130 * initstate( 1, randtbl, 128 ) 131 * (The position of the rear pointer, rptr, is really 0 (as explained above 132 * in the initialization of randtbl) because the state table pointer is set 133 * to point to randtbl[1] (as explained below). 134 */ 135 136 static long *fptr = &randtbl[ SEP_3 + 1 ]; 137 static long *rptr = &randtbl[ 1 ]; 138 139 140 141 /* 142 * The following things are the pointer to the state information table, 143 * the type of the current generator, the degree of the current polynomial 144 * being used, and the separation between the two pointers. 145 * Note that for efficiency of random(), we remember the first location of 146 * the state information, not the zeroeth. Hence it is valid to access 147 * state[-1], which is used to store the type of the R.N.G. 148 * Also, we remember the last location, since this is more efficient than 149 * indexing every time to find the address of the last element to see if 150 * the front and rear pointers have wrapped. 151 */ 152 153 static long *state = &randtbl[ 1 ]; 154 155 static int rand_type = TYPE_3; 156 static int rand_deg = DEG_3; 157 static int rand_sep = SEP_3; 158 159 static long *end_ptr = &randtbl[ DEG_3 + 1 ]; 160 161 162 163 /* 164 * srandom: 165 * Initialize the random number generator based on the given seed. If the 166 * type is the trivial no-state-information type, just remember the seed. 167 * Otherwise, initializes state[] based on the given "seed" via a linear 168 * congruential generator. Then, the pointers are set to known locations 169 * that are exactly rand_sep places apart. Lastly, it cycles the state 170 * information a given number of times to get rid of any initial dependencies 171 * introduced by the L.C.R.N.G. 172 * Note that the initialization of randtbl[] for default usage relies on 173 * values produced by this routine. 174 */ 175 176 void 177 srandom( x ) 178 179 unsigned x; 180 { 181 register int i, j; 182 183 if( rand_type == TYPE_0 ) { 184 state[ 0 ] = x; 185 } 186 else { 187 j = 1; 188 state[ 0 ] = x; 189 for( i = 1; i < rand_deg; i++ ) { 190 state[i] = 1103515245*state[i - 1] + 12345; 191 } 192 fptr = &state[ rand_sep ]; 193 rptr = &state[ 0 ]; 194 for( i = 0; i < 10*rand_deg; i++ ) 195 (void) random(); 196 } 197 } 198 199 200 201 /* 202 * initstate: 203 * Initialize the state information in the given array of n bytes for 204 * future random number generation. Based on the number of bytes we 205 * are given, and the break values for the different R.N.G.'s, we choose 206 * the best (largest) one we can and set things up for it. srandom() is 207 * then called to initialize the state information. 208 * Note that on return from srandom(), we set state[-1] to be the type 209 * multiplexed with the current value of the rear pointer; this is so 210 * successive calls to initstate() won't lose this information and will 211 * be able to restart with setstate(). 212 * Note: the first thing we do is save the current state, if any, just like 213 * setstate() so that it doesn't matter when initstate is called. 214 * Returns a pointer to the old state. 215 */ 216 217 char * 218 initstate( seed, arg_state, n ) 219 220 unsigned seed; /* seed for R. N. G. */ 221 char *arg_state; /* pointer to state array */ 222 int n; /* # bytes of state info */ 223 { 224 register char *ostate = (char *)( &state[ -1 ] ); 225 226 if( rand_type == TYPE_0 ) state[ -1 ] = rand_type; 227 else state[ -1 ] = MAX_TYPES*(rptr - state) + rand_type; 228 if( n < BREAK_1 ) { 229 if( n < BREAK_0 ) { 230 fprintf( stderr, "initstate: not enough state (%d bytes); ignored.\n", n ); 231 return 0; 232 } 233 rand_type = TYPE_0; 234 rand_deg = DEG_0; 235 rand_sep = SEP_0; 236 } 237 else { 238 if( n < BREAK_2 ) { 239 rand_type = TYPE_1; 240 rand_deg = DEG_1; 241 rand_sep = SEP_1; 242 } 243 else { 244 if( n < BREAK_3 ) { 245 rand_type = TYPE_2; 246 rand_deg = DEG_2; 247 rand_sep = SEP_2; 248 } 249 else { 250 if( n < BREAK_4 ) { 251 rand_type = TYPE_3; 252 rand_deg = DEG_3; 253 rand_sep = SEP_3; 254 } 255 else { 256 rand_type = TYPE_4; 257 rand_deg = DEG_4; 258 rand_sep = SEP_4; 259 } 260 } 261 } 262 } 263 state = &( ( (long *)arg_state )[1] ); /* first location */ 264 end_ptr = &state[ rand_deg ]; /* must set end_ptr before srandom */ 265 srandom( seed ); 266 if( rand_type == TYPE_0 ) state[ -1 ] = rand_type; 267 else state[ -1 ] = MAX_TYPES*(rptr - state) + rand_type; 268 return( ostate ); 269 } 270 271 272 273 /* 274 * setstate: 275 * Restore the state from the given state array. 276 * Note: it is important that we also remember the locations of the pointers 277 * in the current state information, and restore the locations of the pointers 278 * from the old state information. This is done by multiplexing the pointer 279 * location into the zeroeth word of the state information. 280 * Note that due to the order in which things are done, it is OK to call 281 * setstate() with the same state as the current state. 282 * Returns a pointer to the old state information. 283 */ 284 285 char * 286 setstate( arg_state ) 287 288 char *arg_state; 289 { 290 register long *new_state = (long *)arg_state; 291 register int type = new_state[0]%MAX_TYPES; 292 register int rear = new_state[0]/MAX_TYPES; 293 char *ostate = (char *)( &state[ -1 ] ); 294 295 if( rand_type == TYPE_0 ) state[ -1 ] = rand_type; 296 else state[ -1 ] = MAX_TYPES*(rptr - state) + rand_type; 297 switch( type ) { 298 case TYPE_0: 299 case TYPE_1: 300 case TYPE_2: 301 case TYPE_3: 302 case TYPE_4: 303 rand_type = type; 304 rand_deg = degrees[ type ]; 305 rand_sep = seps[ type ]; 306 break; 307 308 default: 309 fprintf( stderr, "setstate: state info has been munged; not changed.\n" ); 310 } 311 state = &new_state[ 1 ]; 312 if( rand_type != TYPE_0 ) { 313 rptr = &state[ rear ]; 314 fptr = &state[ (rear + rand_sep)%rand_deg ]; 315 } 316 end_ptr = &state[ rand_deg ]; /* set end_ptr too */ 317 return( ostate ); 318 } 319 320 321 322 /* 323 * random: 324 * If we are using the trivial TYPE_0 R.N.G., just do the old linear 325 * congruential bit. Otherwise, we do our fancy trinomial stuff, which is the 326 * same in all ther other cases due to all the global variables that have been 327 * set up. The basic operation is to add the number at the rear pointer into 328 * the one at the front pointer. Then both pointers are advanced to the next 329 * location cyclically in the table. The value returned is the sum generated, 330 * reduced to 31 bits by throwing away the "least random" low bit. 331 * Note: the code takes advantage of the fact that both the front and 332 * rear pointers can't wrap on the same call by not testing the rear 333 * pointer if the front one has wrapped. 334 * Returns a 31-bit random number. 335 */ 336 337 long 338 random() 339 { 340 long i; 341 342 if( rand_type == TYPE_0 ) { 343 i = state[0] = ( state[0]*1103515245 + 12345 )&0x7fffffff; 344 } 345 else { 346 *fptr += *rptr; 347 i = (*fptr >> 1)&0x7fffffff; /* chucking least random bit */ 348 if( ++fptr >= end_ptr ) { 349 fptr = state; 350 ++rptr; 351 } 352 else { 353 if( ++rptr >= end_ptr ) rptr = state; 354 } 355 } 356 return( i ); 357 } 358