(root)/
gawk-5.2.2/
support/
random.c
       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
       9   *    notice, this list of conditions and the following disclaimer.
      10   * 2. Redistributions in binary form must reproduce the above copyright
      11   *    notice, this list of conditions and the following disclaimer in the
      12   *    documentation and/or other materials provided with the distribution.
      13   * 3. Neither the name of the University nor the names of its contributors
      14   *    may be used to endorse or promote products derived from this software
      15   *    without specific prior written permission.
      16   *
      17   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      18   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      19   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      20   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      21   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      22   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      23   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      24   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      25   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      26   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      27   * SUCH DAMAGE.
      28   */
      29  
      30  /*
      31   * Per the statement at http://opensource.org/licenses/bsd-license.php,
      32   *
      33   *	The advertising clause in the license appearing on BSD Unix files was
      34   *	officially rescinded by the Director of the Office of Technology
      35   *	Licensing of the University of California on July 22 1999. He states
      36   *	that clause 3 is "hereby deleted in its entirety."
      37   *
      38   * I removed the advertising clause in the above copyright.
      39   * The above web site points to
      40   * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change.
      41   *
      42   * Arnold Robbins
      43   * 15 September 2007
      44   */
      45  
      46  #if defined(LIBC_SCCS) && !defined(lint)
      47  static const char sccsid[] = "@(#)random.c	8.2 (Berkeley) 5/19/95";
      48  #endif /* LIBC_SCCS and not lint */
      49  
      50  #ifdef HAVE_CONFIG_H		/* gawk addition */
      51  #include <config.h>
      52  #endif
      53  
      54  #ifdef HAVE_FCNTL_H
      55  #include <fcntl.h>
      56  #endif
      57  #include <stdio.h>
      58  #include <stdlib.h>
      59  #ifdef HAVE_UNISTD_H
      60  #include <unistd.h>
      61  #endif
      62  
      63  #include <assert.h>
      64  
      65  #include "random.h"		/* gawk addition */
      66  
      67  #ifdef HAVE_SYS_TIME_H		/* gawk addition */
      68  #include <sys/time.h>
      69  #endif
      70  
      71  #if 0
      72  #include <sys/cdefs.h>
      73  __FBSDID("$FreeBSD: /repoman/r/ncvs/src/lib/libc/stdlib/random.c,v 1.24 2004/01/20 03:02:18 das Exp $");
      74  
      75  #include "namespace.h"
      76  #include <sys/time.h>          /* for srandomdev() */
      77  #include <fcntl.h>             /* for srandomdev() */
      78  #include <stdint.h>
      79  #include <stdio.h>
      80  #include <stdlib.h>
      81  #include <unistd.h>            /* for srandomdev() */
      82  #include "un-namespace.h"
      83  #endif
      84  
      85  /*
      86   * random.c:
      87   *
      88   * An improved random number generation package.  In addition to the standard
      89   * rand()/srand() like interface, this package also has a special state info
      90   * interface.  The initstate() routine is called with a seed, an array of
      91   * bytes, and a count of how many bytes are being passed in; this array is
      92   * then initialized to contain information for random number generation with
      93   * that much state information.  Good sizes for the amount of state
      94   * information are 32, 64, 128, and 256 bytes.  The state can be switched by
      95   * calling the setstate() routine with the same array as was initiallized
      96   * with initstate().  By default, the package runs with 128 bytes of state
      97   * information and generates far better random numbers than a linear
      98   * congruential generator.  If the amount of state information is less than
      99   * 32 bytes, a simple linear congruential R.N.G. is used.
     100   *
     101   * Internally, the state information is treated as an array of uint32_t's; the
     102   * zeroeth element of the array is the type of R.N.G. being used (small
     103   * integer); the remainder of the array is the state information for the
     104   * R.N.G.  Thus, 32 bytes of state information will give 7 ints worth of
     105   * state information, which will allow a degree seven polynomial.  (Note:
     106   * the zeroeth word of state information also has some other information
     107   * stored in it -- see setstate() for details).
     108   *
     109   * The random number generation technique is a linear feedback shift register
     110   * approach, employing trinomials (since there are fewer terms to sum up that
     111   * way).  In this approach, the least significant bit of all the numbers in
     112   * the state table will act as a linear feedback shift register, and will
     113   * have period 2^deg - 1 (where deg is the degree of the polynomial being
     114   * used, assuming that the polynomial is irreducible and primitive).  The
     115   * higher order bits will have longer periods, since their values are also
     116   * influenced by pseudo-random carries out of the lower bits.  The total
     117   * period of the generator is approximately deg*(2**deg - 1); thus doubling
     118   * the amount of state information has a vast influence on the period of the
     119   * generator.  Note: the deg*(2**deg - 1) is an approximation only good for
     120   * large deg, when the period of the shift is the dominant factor.
     121   * With deg equal to seven, the period is actually much longer than the
     122   * 7*(2**7 - 1) predicted by this formula.
     123   *
     124   * Modified 28 December 1994 by Jacob S. Rosenberg.
     125   * The following changes have been made:
     126   * All references to the type u_int have been changed to unsigned long.
     127   * All references to type int have been changed to type long.  Other
     128   * cleanups have been made as well.  A warning for both initstate and
     129   * setstate has been inserted to the effect that on Sparc platforms
     130   * the 'arg_state' variable must be forced to begin on word boundaries.
     131   * This can be easily done by casting a long integer array to char *.
     132   * The overall logic has been left STRICTLY alone.  This software was
     133   * tested on both a VAX and Sun SpacsStation with exactly the same
     134   * results.  The new version and the original give IDENTICAL results.
     135   * The new version is somewhat faster than the original.  As the
     136   * documentation says:  "By default, the package runs with 128 bytes of
     137   * state information and generates far better random numbers than a linear
     138   * congruential generator.  If the amount of state information is less than
     139   * 32 bytes, a simple linear congruential R.N.G. is used."  For a buffer of
     140   * 128 bytes, this new version runs about 19 percent faster and for a 16
     141   * byte buffer it is about 5 percent faster.
     142   *
     143   * Modified 06 February 2016 by Nelson H. F. Beebe to interface to a
     144   * shuffle buffer, producing a huge period, and removing long-range
     145   * correlations of the basic low-level generator.  See comments and
     146   * literature references in random() at the end of this file.
     147   */
     148  
     149  #define SHUFFLE_BITS	9			/* see comments in random() below for this choice */
     150  #define SHUFFLE_MAX	(1 << SHUFFLE_BITS)	/* MUST be power of two */
     151  #define SHUFFLE_MASK	(SHUFFLE_MAX - 1)	/* (k & SHUFFLE_MASK) is in [0, SHUFFLE_MAX - 1] */
     152  
     153  static int  shuffle_init = 1;
     154  static long shuffle_buffer[SHUFFLE_MAX];
     155  
     156  /*
     157   * For each of the currently supported random number generators, we have a
     158   * break value on the amount of state information (you need at least this
     159   * many bytes of state info to support this random number generator), a degree
     160   * for the polynomial (actually a trinomial) that the R.N.G. is based on, and
     161   * the separation between the two lower order coefficients of the trinomial.
     162   */
     163  #define	TYPE_0		0		/* linear congruential */
     164  #define	BREAK_0		8
     165  #define	DEG_0		0
     166  #define	SEP_0		0
     167  
     168  #define	TYPE_1		1		/* x**7 + x**3 + 1 */
     169  #define	BREAK_1		32
     170  #define	DEG_1		7
     171  #define	SEP_1		3
     172  
     173  #define	TYPE_2		2		/* x**15 + x + 1 */
     174  #define	BREAK_2		64
     175  #define	DEG_2		15
     176  #define	SEP_2		1
     177  
     178  #define	TYPE_3		3		/* x**31 + x**3 + 1 */
     179  #define	BREAK_3		128
     180  #define	DEG_3		31
     181  #define	SEP_3		3
     182  
     183  #define	TYPE_4		4		/* x**63 + x + 1 */
     184  #define	BREAK_4		256
     185  #define	DEG_4		63
     186  #define	SEP_4		1
     187  
     188  /*
     189   * Array versions of the above information to make code run faster --
     190   * relies on fact that TYPE_i == i.
     191   */
     192  #define	MAX_TYPES	5		/* max number of types above */
     193  
     194  #ifdef  USE_WEAK_SEEDING
     195  #define NSHUFF 0
     196  #else   /* !USE_WEAK_SEEDING */
     197  #define NSHUFF 50       /* to drop some "seed -> 1st value" linearity */
     198  #endif  /* !USE_WEAK_SEEDING */
     199  
     200  static const int degrees[MAX_TYPES] =	{ DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 };
     201  static const int seps [MAX_TYPES] =	{ SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 };
     202  
     203  /*
     204   * Initially, everything is set up as if from:
     205   *
     206   *	initstate(1, randtbl, 128);
     207   *
     208   * Note that this initialization takes advantage of the fact that srandom()
     209   * advances the front and rear pointers 10*rand_deg times, and hence the
     210   * rear pointer which starts at 0 will also end up at zero; thus the zeroeth
     211   * element of the state information, which contains info about the current
     212   * position of the rear pointer is just
     213   *
     214   *	MAX_TYPES * (rptr - state) + TYPE_3 == TYPE_3.
     215   */
     216  
     217  static uint32_t randtbl[DEG_3 + 1] = {
     218  	TYPE_3,
     219  #ifdef  USE_WEAK_SEEDING
     220  /* Historic implementation compatibility */
     221  /* The random sequences do not vary much with the seed */
     222  	0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, 0xde3b81e0, 0xdf0a6fb5,
     223  	0xf103bc02, 0x48f340fb, 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd,
     224  	0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88,
     225  	0xe369735d, 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc,
     226  	0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b,
     227  	0x27fb47b9,
     228  #else   /* !USE_WEAK_SEEDING */
     229  	0x991539b1, 0x16a5bce3, 0x6774a4cd, 0x3e01511e, 0x4e508aaa, 0x61048c05,
     230  	0xf5500617, 0x846b7115, 0x6a19892c, 0x896a97af, 0xdb48f936, 0x14898454,
     231  	0x37ffd106, 0xb58bff9c, 0x59e17104, 0xcf918a49, 0x09378c83, 0x52c7a471,
     232  	0x8d293ea9, 0x1f4fc301, 0xc3db71be, 0x39b44e1c, 0xf8a44ef9, 0x4c8b80b1,
     233  	0x19edc328, 0x87bf4bdd, 0xc9b240e5, 0xe9ee4b1b, 0x4382aee7, 0x535b6b41,
     234  	0xf3bec5da
     235  #endif  /* !USE_WEAK_SEEDING */
     236  };
     237  
     238  /*
     239   * fptr and rptr are two pointers into the state info, a front and a rear
     240   * pointer.  These two pointers are always rand_sep places aparts, as they
     241   * cycle cyclically through the state information.  (Yes, this does mean we
     242   * could get away with just one pointer, but the code for random() is more
     243   * efficient this way).  The pointers are left positioned as they would be
     244   * from the call
     245   *
     246   *	initstate(1, randtbl, 128);
     247   *
     248   * (The position of the rear pointer, rptr, is really 0 (as explained above
     249   * in the initialization of randtbl) because the state table pointer is set
     250   * to point to randtbl[1] (as explained below).
     251   */
     252  static uint32_t *fptr = &randtbl[SEP_3 + 1];
     253  static uint32_t *rptr = &randtbl[1];
     254  
     255  /*
     256   * The following things are the pointer to the state information table, the
     257   * type of the current generator, the degree of the current polynomial being
     258   * used, and the separation between the two pointers.  Note that for efficiency
     259   * of random(), we remember the first location of the state information, not
     260   * the zeroeth.  Hence it is valid to access state[-1], which is used to
     261   * store the type of the R.N.G.  Also, we remember the last location, since
     262   * this is more efficient than indexing every time to find the address of
     263   * the last element to see if the front and rear pointers have wrapped.
     264   */
     265  static uint32_t *state = &randtbl[1];
     266  static int rand_type = TYPE_3;
     267  static int rand_deg = DEG_3;
     268  static int rand_sep = SEP_3;
     269  static uint32_t *end_ptr = &randtbl[DEG_3 + 1];
     270  
     271  static inline uint32_t good_rand(int32_t);
     272  
     273  static inline uint32_t good_rand (int32_t x)
     274  {
     275  #ifdef  USE_WEAK_SEEDING
     276  /*
     277   * Historic implementation compatibility.
     278   * The random sequences do not vary much with the seed,
     279   * even with overflowing.
     280   */
     281  	return (1103515245 * x + 12345);
     282  #else   /* !USE_WEAK_SEEDING */
     283  /*
     284   * Compute x = (7^5 * x) mod (2^31 - 1)
     285   * wihout overflowing 31 bits:
     286   *      (2^31 - 1) = 127773 * (7^5) + 2836
     287   * From "Random number generators: good ones are hard to find",
     288   * Park and Miller, Communications of the ACM, vol. 31, no. 10,
     289   * October 1988, p. 1195.
     290   */
     291  	int32_t hi, lo;
     292  
     293  	/* Can't be initialized with 0, so use another value. */
     294  	if (x == 0)
     295  		x = 123459876;
     296  	hi = x / 127773;
     297  	lo = x % 127773;
     298  	x = 16807 * lo - 2836 * hi;
     299  	if (x < 0)
     300  		x += 0x7fffffff;
     301  	return (x);
     302  #endif  /* !USE_WEAK_SEEDING */
     303  }
     304  
     305  /*
     306   * srandom:
     307   *
     308   * Initialize the random number generator based on the given seed.  If the
     309   * type is the trivial no-state-information type, just remember the seed.
     310   * Otherwise, initializes state[] based on the given "seed" via a linear
     311   * congruential generator.  Then, the pointers are set to known locations
     312   * that are exactly rand_sep places apart.  Lastly, it cycles the state
     313   * information a given number of times to get rid of any initial dependencies
     314   * introduced by the L.C.R.N.G.  Note that the initialization of randtbl[]
     315   * for default usage relies on values produced by this routine.
     316   */
     317  void
     318  srandom(unsigned long x)
     319  {
     320  	int i, lim;
     321  
     322  	shuffle_init = 1;
     323  
     324  	state[0] = (uint32_t)x;
     325  	if (rand_type == TYPE_0)
     326  		lim = NSHUFF;
     327  	else {
     328  		for (i = 1; i < rand_deg; i++)
     329  			state[i] = good_rand(state[i - 1]);
     330  		fptr = &state[rand_sep];
     331  		rptr = &state[0];
     332  		lim = 10 * rand_deg;
     333  	}
     334  	for (i = 0; i < lim; i++)
     335  		(void)random();
     336  }
     337  
     338  #if 0 /* gawk doesn't use this */
     339  /*
     340   * srandomdev:
     341   *
     342   * Many programs choose the seed value in a totally predictable manner.
     343   * This often causes problems.  We seed the generator using the much more
     344   * secure random(4) interface.  Note that this particular seeding
     345   * procedure can generate states which are impossible to reproduce by
     346   * calling srandom() with any value, since the succeeding terms in the
     347   * state buffer are no longer derived from the LC algorithm applied to
     348   * a fixed seed.
     349   */
     350  void
     351  srandomdev()
     352  {
     353  	int fd, done;
     354  	size_t len;
     355  
     356  	if (rand_type == TYPE_0)
     357  		len = sizeof state[0];
     358  	else
     359  		len = rand_deg * sizeof state[0];
     360  
     361  	done = 0;
     362  	fd = open("/dev/random", O_RDONLY, 0);
     363  	if (fd >= 0) {
     364  		if (read(fd, (void *) state, len) == (ssize_t) len)
     365  			done = 1;
     366  		close(fd);
     367  	}
     368  
     369  	if (!done) {
     370  		struct timeval tv;
     371  		unsigned long junk;
     372  
     373  		gettimeofday(&tv, NULL);
     374  		srandom((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk);
     375  		return;
     376  	}
     377  
     378  	if (rand_type != TYPE_0) {
     379  		fptr = &state[rand_sep];
     380  		rptr = &state[0];
     381  	}
     382  }
     383  #endif
     384  
     385  /*
     386   * initstate:
     387   *
     388   * Initialize the state information in the given array of n bytes for future
     389   * random number generation.  Based on the number of bytes we are given, and
     390   * the break values for the different R.N.G.'s, we choose the best (largest)
     391   * one we can and set things up for it.  srandom() is then called to
     392   * initialize the state information.
     393   *
     394   * Note that on return from srandom(), we set state[-1] to be the type
     395   * multiplexed with the current value of the rear pointer; this is so
     396   * successive calls to initstate() won't lose this information and will be
     397   * able to restart with setstate().
     398   *
     399   * Note: the first thing we do is save the current state, if any, just like
     400   * setstate() so that it doesn't matter when initstate is called.
     401   *
     402   * Returns a pointer to the old state.
     403   *
     404   * Note: The Sparc platform requires that arg_state begin on an int
     405   * word boundary; otherwise a bus error will occur. Even so, lint will
     406   * complain about mis-alignment, but you should disregard these messages.
     407   */
     408  char *
     409  initstate(
     410  	unsigned long seed,		/* seed for R.N.G. */
     411  	char *arg_state,		/* pointer to state array */
     412  	long n)				/* # bytes of state info */
     413  {
     414  	char *ostate = (char *)(&state[-1]);
     415  	uint32_t *int_arg_state = (uint32_t *)arg_state;
     416  
     417  	if (rand_type == TYPE_0)
     418  		state[-1] = rand_type;
     419  	else
     420  		state[-1] = MAX_TYPES * (rptr - state) + rand_type;
     421  	if (n < BREAK_0) {
     422  		(void)fprintf(stderr,
     423  		    "random: not enough state (%ld bytes); ignored.\n", n);
     424  		return(0);
     425  	}
     426  	if (n < BREAK_1) {
     427  		rand_type = TYPE_0;
     428  		rand_deg = DEG_0;
     429  		rand_sep = SEP_0;
     430  	} else if (n < BREAK_2) {
     431  		rand_type = TYPE_1;
     432  		rand_deg = DEG_1;
     433  		rand_sep = SEP_1;
     434  	} else if (n < BREAK_3) {
     435  		rand_type = TYPE_2;
     436  		rand_deg = DEG_2;
     437  		rand_sep = SEP_2;
     438  	} else if (n < BREAK_4) {
     439  		rand_type = TYPE_3;
     440  		rand_deg = DEG_3;
     441  		rand_sep = SEP_3;
     442  	} else {
     443  		rand_type = TYPE_4;
     444  		rand_deg = DEG_4;
     445  		rand_sep = SEP_4;
     446  	}
     447  	state = int_arg_state + 1; /* first location */
     448  	end_ptr = &state[rand_deg];	/* must set end_ptr before srandom */
     449  	srandom(seed);
     450  	if (rand_type == TYPE_0)
     451  		int_arg_state[0] = rand_type;
     452  	else
     453  		int_arg_state[0] = MAX_TYPES * (rptr - state) + rand_type;
     454  	return(ostate);
     455  }
     456  
     457  /*
     458   * setstate:
     459   *
     460   * Restore the state from the given state array.
     461   *
     462   * Note: it is important that we also remember the locations of the pointers
     463   * in the current state information, and restore the locations of the pointers
     464   * from the old state information.  This is done by multiplexing the pointer
     465   * location into the zeroeth word of the state information.
     466   *
     467   * Note that due to the order in which things are done, it is OK to call
     468   * setstate() with the same state as the current state.
     469   *
     470   * Returns a pointer to the old state information.
     471   *
     472   * Note: The Sparc platform requires that arg_state begin on an int
     473   * word boundary; otherwise a bus error will occur. Even so, lint will
     474   * complain about mis-alignment, but you should disregard these messages.
     475   */
     476  char *
     477  setstate(char *arg_state)		/* pointer to state array */
     478  {
     479  	uint32_t *new_state = (uint32_t *)arg_state;
     480  	uint32_t type = new_state[0] % MAX_TYPES;
     481  	uint32_t rear = new_state[0] / MAX_TYPES;
     482  	char *ostate = (char *)(&state[-1]);
     483  
     484  	if (rand_type == TYPE_0)
     485  		state[-1] = rand_type;
     486  	else
     487  		state[-1] = MAX_TYPES * (rptr - state) + rand_type;
     488  	switch(type) {
     489  	case TYPE_0:
     490  	case TYPE_1:
     491  	case TYPE_2:
     492  	case TYPE_3:
     493  	case TYPE_4:
     494  		rand_type = type;
     495  		rand_deg = degrees[type];
     496  		rand_sep = seps[type];
     497  		break;
     498  	default:
     499  		(void)fprintf(stderr,
     500  		    "random: state info corrupted; not changed.\n");
     501  	}
     502  	state = new_state + 1;
     503  	if (rand_type != TYPE_0) {
     504  		rptr = &state[rear];
     505  		fptr = &state[(rear + rand_sep) % rand_deg];
     506  	}
     507  	end_ptr = &state[rand_deg];		/* set end_ptr too */
     508  	return(ostate);
     509  }
     510  
     511  /*
     512   * random:
     513   *
     514   * If we are using the trivial TYPE_0 R.N.G., just do the old linear
     515   * congruential bit.  Otherwise, we do our fancy trinomial stuff, which is
     516   * the same in all the other cases due to all the global variables that have
     517   * been set up.  The basic operation is to add the number at the rear pointer
     518   * into the one at the front pointer.  Then both pointers are advanced to
     519   * the next location cyclically in the table.  The value returned is the sum
     520   * generated, reduced to 31 bits by throwing away the "least random" low bit.
     521   *
     522   * Note: the code takes advantage of the fact that both the front and
     523   * rear pointers can't wrap on the same call by not testing the rear
     524   * pointer if the front one has wrapped.
     525   *
     526   * Returns a 31-bit random number.
     527   */
     528  static long
     529  random_old()
     530  {
     531  	uint32_t i;
     532  	uint32_t *f, *r;
     533  
     534  	if (rand_type == TYPE_0) {
     535  		i = state[0];
     536  		state[0] = i = (good_rand(i)) & 0x7fffffff;
     537  	} else {
     538  		/*
     539  		 * Use local variables rather than static variables for speed.
     540  		 */
     541  		f = fptr; r = rptr;
     542  		*f += *r;
     543  		i = (*f >> 1) & 0x7fffffff;	/* chucking least random bit */
     544  		if (++f >= end_ptr) {
     545  			f = state;
     546  			++r;
     547  		}
     548  		else if (++r >= end_ptr) {
     549  			r = state;
     550  		}
     551  
     552  		fptr = f; rptr = r;
     553  	}
     554  	return((long)i);
     555  }
     556  
     557  long
     558  random()
     559  {
     560  	/*
     561  	 * This function is a wrapper to the original random(), now renamed
     562  	 * random_old(), to interpose a shuffle buffer to dramatically extend
     563  	 * the generator period at nearly zero additional execution cost,
     564  	 * and an additional storage cost set by the size of the
     565  	 * shuffle buffer (default: 512 longs, or 2K or 4K bytes).
     566  	 * The algorithm was first described in
     567  	 *
     568  	 *     Carter Bays and S. D. Durham
     569  	 *     Improving a Poor Random Number Generator
     570  	 *     ACM Transactions on Mathematical Software (TOMS) 2(1) 59--64 (March 1976)
     571  	 *     http://dx.doi.org/10.1145/355666.355670
     572  	 * 
     573  	 * and later revisited in
     574  	 * 
     575  	 *     Carter Bays
     576  	 *     C364. Improving a random number generator: a comparison between two shuffling methods
     577  	 *     Journal of Statistical Computation and Simulation 36(1) 57--59 (May 1990)
     578  	 *     http://dx.doi.org/10.1080/00949659008811264
     579  	 *
     580  	 * The second paper is critically important because it
     581  	 * emphasizes how an apparently trivial change to the final
     582  	 * element selection can destroy the period-lengthening
     583  	 * feature of the original shuffle algorithm.
     584  	 * 
     585  	 * Here is a table of the increase in period size for a
     586  	 * shuffle generator using 32-bit and 64-bit unsigned integer
     587  	 * linear congruential generators, which are known to have
     588  	 * significant correlations, and are thus inadvisable for
     589  	 * serious work with random numbers:
     590  	 *
     591  	 * hocd128> for (n = 32; n < 4096; n *= 2) \
     592  	 *              printf("%7d\t%12.3.4e\t%12.3.4e\n",
     593  	 *              n, \
     594  	 *              sqrt(PI * gamma(n + 1)/(2**32 - 1)) / (2**32 - 1), \\
     595  	 *              sqrt(PI * gamma(n + 1)/(2**64 - 1)) / (2**64 - 1))
     596  	 * 
     597  	 *      32    3.230e+03       1.148e-11
     598  	 *      64    2.243e+30       7.969e+15
     599  	 *     128    3.910e+93       1.389e+79
     600  	 *     256   1.844e+239      6.552e+224
     601  	 *     512   1.174e+569      4.172e+554
     602  	 *    1024  4.635e+1305     1.647e+1291
     603  	 *    2048  8.144e+2932     2.893e+2918
     604  	 *
     605  	 * A generator giving one result per nanosecond would produce
     606  	 * about 3.16e16 random numbers per year, so even for
     607  	 * massively parallel operations with, say, one million CPU
     608  	 * cores, it could not produce more than 10**23 values per
     609  	 * year.  The main benefit of an enormous period is that it
     610  	 * makes long-range correlations vanishingly unlikely, even
     611  	 * when starting seeds are similar (e.g., seeds of 0, 1, 2,
     612  	 * ...), and therefore makes possible families of generators
     613  	 * (needed in parallel computations) where the probability of
     614  	 * sequence overlap between family members is essentially
     615  	 * zero.
     616  	 */
     617  
     618  	int k;
     619  	long r;
     620  	static long s = 0xcafefeedL;
     621  
     622  	if (shuffle_init) {	/* first time, or seed changed by srand() */
     623  		for (k = 0; k < SHUFFLE_MAX; k++)
     624  			shuffle_buffer[k] = random_old();
     625  
     626  		s = random_old();
     627  		shuffle_init = 0;
     628  	}
     629  
     630  	r = random_old();
     631  	k = s & SHUFFLE_MASK;		/* random index into shuffle_buffer[] */
     632  
     633  	assert(0L <= k && k < SHUFFLE_MAX);
     634  
     635  	s = shuffle_buffer[k];
     636  	shuffle_buffer[k] = r;
     637  
     638  	return (s);
     639  }