random.c (18832) | random.c (23662) |
---|---|
1/* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 18 unchanged lines hidden (view full) --- 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#if defined(LIBC_SCCS) && !defined(lint) | 1/* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 18 unchanged lines hidden (view full) --- 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#if defined(LIBC_SCCS) && !defined(lint) |
35static char sccsid[] = "@(#)random.c 8.1 (Berkeley) 6/4/93"; | 35static char sccsid[] = "@(#)random.c 8.2 (Berkeley) 5/19/95"; |
36#endif /* LIBC_SCCS and not lint */ 37 38#ifdef COMPAT_WEAK_SEEDING 39#define USE_WEAK_SEEDING 40#define random orandom 41#define srandom osrandom 42#define initstate oinitstate 43#define setstate osetstate --- 35 unchanged lines hidden (view full) --- 79 * higher order bits will have longer periods, since their values are also 80 * influenced by pseudo-random carries out of the lower bits. The total 81 * period of the generator is approximately deg*(2**deg - 1); thus doubling 82 * the amount of state information has a vast influence on the period of the 83 * generator. Note: the deg*(2**deg - 1) is an approximation only good for 84 * large deg, when the period of the shift register is the dominant factor. 85 * With deg equal to seven, the period is actually much longer than the 86 * 7*(2**7 - 1) predicted by this formula. | 36#endif /* LIBC_SCCS and not lint */ 37 38#ifdef COMPAT_WEAK_SEEDING 39#define USE_WEAK_SEEDING 40#define random orandom 41#define srandom osrandom 42#define initstate oinitstate 43#define setstate osetstate --- 35 unchanged lines hidden (view full) --- 79 * higher order bits will have longer periods, since their values are also 80 * influenced by pseudo-random carries out of the lower bits. The total 81 * period of the generator is approximately deg*(2**deg - 1); thus doubling 82 * the amount of state information has a vast influence on the period of the 83 * generator. Note: the deg*(2**deg - 1) is an approximation only good for 84 * large deg, when the period of the shift register is the dominant factor. 85 * With deg equal to seven, the period is actually much longer than the 86 * 7*(2**7 - 1) predicted by this formula. |
87 * 88 * Modified 28 December 1994 by Jacob S. Rosenberg. 89 * The following changes have been made: 90 * All references to the type u_int have been changed to unsigned long. 91 * All references to type int have been changed to type long. Other 92 * cleanups have been made as well. A warning for both initstate and 93 * setstate has been inserted to the effect that on Sparc platforms 94 * the 'arg_state' variable must be forced to begin on word boundaries. 95 * This can be easily done by casting a long integer array to char *. 96 * The overall logic has been left STRICTLY alone. This software was 97 * tested on both a VAX and Sun SpacsStation with exactly the same 98 * results. The new version and the original give IDENTICAL results. 99 * The new version is somewhat faster than the original. As the 100 * documentation says: "By default, the package runs with 128 bytes of 101 * state information and generates far better random numbers than a linear 102 * congruential generator. If the amount of state information is less than 103 * 32 bytes, a simple linear congruential R.N.G. is used." For a buffer of 104 * 128 bytes, this new version runs about 19 percent faster and for a 16 105 * byte buffer it is about 5 percent faster. |
|
87 */ 88 89/* 90 * For each of the currently supported random number generators, we have a 91 * break value on the amount of state information (you need at least this 92 * many bytes of state info to support this random number generator), a degree 93 * for the polynomial (actually a trinomial) that the R.N.G. is based on, and 94 * the separation between the two lower order coefficients of the trinomial. --- 24 unchanged lines hidden (view full) --- 119#define SEP_4 1 120 121/* 122 * Array versions of the above information to make code run faster -- 123 * relies on fact that TYPE_i == i. 124 */ 125#define MAX_TYPES 5 /* max number of types above */ 126 | 106 */ 107 108/* 109 * For each of the currently supported random number generators, we have a 110 * break value on the amount of state information (you need at least this 111 * many bytes of state info to support this random number generator), a degree 112 * for the polynomial (actually a trinomial) that the R.N.G. is based on, and 113 * the separation between the two lower order coefficients of the trinomial. --- 24 unchanged lines hidden (view full) --- 138#define SEP_4 1 139 140/* 141 * Array versions of the above information to make code run faster -- 142 * relies on fact that TYPE_i == i. 143 */ 144#define MAX_TYPES 5 /* max number of types above */ 145 |
127static int degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; 128static int seps [MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; | 146static long degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; 147static long seps [MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; |
129 130/* 131 * Initially, everything is set up as if from: 132 * 133 * initstate(1, randtbl, 128); 134 * 135 * Note that this initialization takes advantage of the fact that srandom() 136 * advances the front and rear pointers 10*rand_deg times, and hence the --- 48 unchanged lines hidden (view full) --- 185 * used, and the separation between the two pointers. Note that for efficiency 186 * of random(), we remember the first location of the state information, not 187 * the zeroeth. Hence it is valid to access state[-1], which is used to 188 * store the type of the R.N.G. Also, we remember the last location, since 189 * this is more efficient than indexing every time to find the address of 190 * the last element to see if the front and rear pointers have wrapped. 191 */ 192static long *state = &randtbl[1]; | 148 149/* 150 * Initially, everything is set up as if from: 151 * 152 * initstate(1, randtbl, 128); 153 * 154 * Note that this initialization takes advantage of the fact that srandom() 155 * advances the front and rear pointers 10*rand_deg times, and hence the --- 48 unchanged lines hidden (view full) --- 204 * used, and the separation between the two pointers. Note that for efficiency 205 * of random(), we remember the first location of the state information, not 206 * the zeroeth. Hence it is valid to access state[-1], which is used to 207 * store the type of the R.N.G. Also, we remember the last location, since 208 * this is more efficient than indexing every time to find the address of 209 * the last element to see if the front and rear pointers have wrapped. 210 */ 211static long *state = &randtbl[1]; |
193static int rand_type = TYPE_3; 194static int rand_deg = DEG_3; 195static int rand_sep = SEP_3; | 212static long rand_type = TYPE_3; 213static long rand_deg = DEG_3; 214static long rand_sep = SEP_3; |
196static long *end_ptr = &randtbl[DEG_3 + 1]; 197 198static inline long good_rand __P((long)); 199 200static inline long good_rand (x) 201 register long x; 202{ 203#ifdef USE_WEAK_SEEDING --- 32 unchanged lines hidden (view full) --- 236 * congruential generator. Then, the pointers are set to known locations 237 * that are exactly rand_sep places apart. Lastly, it cycles the state 238 * information a given number of times to get rid of any initial dependencies 239 * introduced by the L.C.R.N.G. Note that the initialization of randtbl[] 240 * for default usage relies on values produced by this routine. 241 */ 242void 243srandom(x) | 215static long *end_ptr = &randtbl[DEG_3 + 1]; 216 217static inline long good_rand __P((long)); 218 219static inline long good_rand (x) 220 register long x; 221{ 222#ifdef USE_WEAK_SEEDING --- 32 unchanged lines hidden (view full) --- 255 * congruential generator. Then, the pointers are set to known locations 256 * that are exactly rand_sep places apart. Lastly, it cycles the state 257 * information a given number of times to get rid of any initial dependencies 258 * introduced by the L.C.R.N.G. Note that the initialization of randtbl[] 259 * for default usage relies on values produced by this routine. 260 */ 261void 262srandom(x) |
244 unsigned int x; | 263 unsigned long x; |
245{ | 264{ |
246 register int i; | 265 register long i; |
247 248 if (rand_type == TYPE_0) 249 state[0] = x; 250 else { 251 state[0] = x; 252 for (i = 1; i < rand_deg; i++) 253 state[i] = good_rand(state[i - 1]); 254 fptr = &state[rand_sep]; --- 16 unchanged lines hidden (view full) --- 271 * multiplexed with the current value of the rear pointer; this is so 272 * successive calls to initstate() won't lose this information and will be 273 * able to restart with setstate(). 274 * 275 * Note: the first thing we do is save the current state, if any, just like 276 * setstate() so that it doesn't matter when initstate is called. 277 * 278 * Returns a pointer to the old state. | 266 267 if (rand_type == TYPE_0) 268 state[0] = x; 269 else { 270 state[0] = x; 271 for (i = 1; i < rand_deg; i++) 272 state[i] = good_rand(state[i - 1]); 273 fptr = &state[rand_sep]; --- 16 unchanged lines hidden (view full) --- 290 * multiplexed with the current value of the rear pointer; this is so 291 * successive calls to initstate() won't lose this information and will be 292 * able to restart with setstate(). 293 * 294 * Note: the first thing we do is save the current state, if any, just like 295 * setstate() so that it doesn't matter when initstate is called. 296 * 297 * Returns a pointer to the old state. |
298 * 299 * Note: The Sparc platform requires that arg_state begin on a long 300 * word boundary; otherwise a bus error will occur. Even so, lint will 301 * complain about mis-alignment, but you should disregard these messages. |
|
279 */ 280char * 281initstate(seed, arg_state, n) | 302 */ 303char * 304initstate(seed, arg_state, n) |
282 unsigned int seed; /* seed for R.N.G. */ | 305 unsigned long seed; /* seed for R.N.G. */ |
283 char *arg_state; /* pointer to state array */ | 306 char *arg_state; /* pointer to state array */ |
284 int n; /* # bytes of state info */ | 307 long n; /* # bytes of state info */ |
285{ 286 register char *ostate = (char *)(&state[-1]); | 308{ 309 register char *ostate = (char *)(&state[-1]); |
310 register long *long_arg_state = (long *) arg_state; |
|
287 288 if (rand_type == TYPE_0) 289 state[-1] = rand_type; 290 else 291 state[-1] = MAX_TYPES * (rptr - state) + rand_type; 292 if (n < BREAK_0) { 293 (void)fprintf(stderr, | 311 312 if (rand_type == TYPE_0) 313 state[-1] = rand_type; 314 else 315 state[-1] = MAX_TYPES * (rptr - state) + rand_type; 316 if (n < BREAK_0) { 317 (void)fprintf(stderr, |
294 "random: not enough state (%d bytes); ignored.\n", n); | 318 "random: not enough state (%ld bytes); ignored.\n", n); |
295 return(0); 296 } 297 if (n < BREAK_1) { 298 rand_type = TYPE_0; 299 rand_deg = DEG_0; 300 rand_sep = SEP_0; 301 } else if (n < BREAK_2) { 302 rand_type = TYPE_1; --- 7 unchanged lines hidden (view full) --- 310 rand_type = TYPE_3; 311 rand_deg = DEG_3; 312 rand_sep = SEP_3; 313 } else { 314 rand_type = TYPE_4; 315 rand_deg = DEG_4; 316 rand_sep = SEP_4; 317 } | 319 return(0); 320 } 321 if (n < BREAK_1) { 322 rand_type = TYPE_0; 323 rand_deg = DEG_0; 324 rand_sep = SEP_0; 325 } else if (n < BREAK_2) { 326 rand_type = TYPE_1; --- 7 unchanged lines hidden (view full) --- 334 rand_type = TYPE_3; 335 rand_deg = DEG_3; 336 rand_sep = SEP_3; 337 } else { 338 rand_type = TYPE_4; 339 rand_deg = DEG_4; 340 rand_sep = SEP_4; 341 } |
318 state = &(((long *)arg_state)[1]); /* first location */ | 342 state = (long *) (long_arg_state + 1); /* first location */ |
319 end_ptr = &state[rand_deg]; /* must set end_ptr before srandom */ 320 srandom(seed); 321 if (rand_type == TYPE_0) | 343 end_ptr = &state[rand_deg]; /* must set end_ptr before srandom */ 344 srandom(seed); 345 if (rand_type == TYPE_0) |
322 state[-1] = rand_type; | 346 long_arg_state[0] = rand_type; |
323 else | 347 else |
324 state[-1] = MAX_TYPES*(rptr - state) + rand_type; | 348 long_arg_state[0] = MAX_TYPES * (rptr - state) + rand_type; |
325 return(ostate); 326} 327 328/* 329 * setstate: 330 * 331 * Restore the state from the given state array. 332 * 333 * Note: it is important that we also remember the locations of the pointers 334 * in the current state information, and restore the locations of the pointers 335 * from the old state information. This is done by multiplexing the pointer 336 * location into the zeroeth word of the state information. 337 * 338 * Note that due to the order in which things are done, it is OK to call 339 * setstate() with the same state as the current state. 340 * 341 * Returns a pointer to the old state information. | 349 return(ostate); 350} 351 352/* 353 * setstate: 354 * 355 * Restore the state from the given state array. 356 * 357 * Note: it is important that we also remember the locations of the pointers 358 * in the current state information, and restore the locations of the pointers 359 * from the old state information. This is done by multiplexing the pointer 360 * location into the zeroeth word of the state information. 361 * 362 * Note that due to the order in which things are done, it is OK to call 363 * setstate() with the same state as the current state. 364 * 365 * Returns a pointer to the old state information. |
366 * 367 * Note: The Sparc platform requires that arg_state begin on a long 368 * word boundary; otherwise a bus error will occur. Even so, lint will 369 * complain about mis-alignment, but you should disregard these messages. |
|
342 */ 343char * 344setstate(arg_state) | 370 */ 371char * 372setstate(arg_state) |
345 char *arg_state; | 373 char *arg_state; /* pointer to state array */ |
346{ | 374{ |
347 register long *new_state = (long *)arg_state; 348 register int type = new_state[0] % MAX_TYPES; 349 register int rear = new_state[0] / MAX_TYPES; | 375 register long *new_state = (long *) arg_state; 376 register long type = new_state[0] % MAX_TYPES; 377 register long rear = new_state[0] / MAX_TYPES; |
350 char *ostate = (char *)(&state[-1]); 351 352 if (rand_type == TYPE_0) 353 state[-1] = rand_type; 354 else 355 state[-1] = MAX_TYPES * (rptr - state) + rand_type; 356 switch(type) { 357 case TYPE_0: --- 4 unchanged lines hidden (view full) --- 362 rand_type = type; 363 rand_deg = degrees[type]; 364 rand_sep = seps[type]; 365 break; 366 default: 367 (void)fprintf(stderr, 368 "random: state info corrupted; not changed.\n"); 369 } | 378 char *ostate = (char *)(&state[-1]); 379 380 if (rand_type == TYPE_0) 381 state[-1] = rand_type; 382 else 383 state[-1] = MAX_TYPES * (rptr - state) + rand_type; 384 switch(type) { 385 case TYPE_0: --- 4 unchanged lines hidden (view full) --- 390 rand_type = type; 391 rand_deg = degrees[type]; 392 rand_sep = seps[type]; 393 break; 394 default: 395 (void)fprintf(stderr, 396 "random: state info corrupted; not changed.\n"); 397 } |
370 state = &new_state[1]; | 398 state = (long *) (new_state + 1); |
371 if (rand_type != TYPE_0) { 372 rptr = &state[rear]; 373 fptr = &state[(rear + rand_sep) % rand_deg]; 374 } 375 end_ptr = &state[rand_deg]; /* set end_ptr too */ 376 return(ostate); 377} 378 --- 12 unchanged lines hidden (view full) --- 391 * rear pointers can't wrap on the same call by not testing the rear 392 * pointer if the front one has wrapped. 393 * 394 * Returns a 31-bit random number. 395 */ 396long 397random() 398{ | 399 if (rand_type != TYPE_0) { 400 rptr = &state[rear]; 401 fptr = &state[(rear + rand_sep) % rand_deg]; 402 } 403 end_ptr = &state[rand_deg]; /* set end_ptr too */ 404 return(ostate); 405} 406 --- 12 unchanged lines hidden (view full) --- 419 * rear pointers can't wrap on the same call by not testing the rear 420 * pointer if the front one has wrapped. 421 * 422 * Returns a 31-bit random number. 423 */ 424long 425random() 426{ |
399 long i; | 427 register long i; 428 register long *f, *r; |
400 | 429 |
401 if (rand_type == TYPE_0) 402 i = state[0] = good_rand(state[0]) & 0x7fffffff; 403 else { 404 *fptr += *rptr; 405 i = (*fptr >> 1) & 0x7fffffff; /* chucking least random bit */ 406 if (++fptr >= end_ptr) { 407 fptr = state; 408 ++rptr; 409 } else if (++rptr >= end_ptr) 410 rptr = state; | 430 if (rand_type == TYPE_0) { 431 i = state[0]; 432 state[0] = i = (good_rand(i)) & 0x7fffffff; 433 } else { 434 /* 435 * Use local variables rather than static variables for speed. 436 */ 437 f = fptr; r = rptr; 438 *f += *r; 439 i = (*f >> 1) & 0x7fffffff; /* chucking least random bit */ 440 if (++f >= end_ptr) { 441 f = state; 442 ++r; 443 } 444 else if (++r >= end_ptr) { 445 r = state; 446 } 447 448 fptr = f; rptr = r; |
411 } 412 return(i); 413} | 449 } 450 return(i); 451} |