00001 /* 00002 * Ported from GNU libc to Windows by Ron Koenderink, 2007 00003 */ 00004 00005 /* Copyright (C) 1995 Free Software Foundation 00006 00007 The GNU C Library is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU Lesser General Public 00009 License as published by the Free Software Foundation; either 00010 version 2.1 of the License, or (at your option) any later version. 00011 00012 The GNU C Library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 Lesser General Public License for more details. 00016 00017 You should have received a copy of the GNU Lesser General Public 00018 License along with the GNU C Library; if not, write to the Free 00019 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 00020 02111-1307 USA. */ 00021 00022 /* 00023 * This is derived from the Berkeley source: 00024 * @(#)random.c 5.5 (Berkeley) 7/6/88 00025 * It was reworked for the GNU C Library by Roland McGrath. 00026 * Rewritten to use reentrant functions by Ulrich Drepper, 1995. 00027 */ 00028 00029 /* 00030 Copyright (C) 1983 Regents of the University of California. 00031 All rights reserved. 00032 00033 Redistribution and use in source and binary forms, with or without 00034 modification, are permitted provided that the following conditions 00035 are met: 00036 00037 1. Redistributions of source code must retain the above copyright 00038 notice, this list of conditions and the following disclaimer. 00039 2. Redistributions in binary form must reproduce the above copyright 00040 notice, this list of conditions and the following disclaimer in the 00041 documentation and/or other materials provided with the distribution. 00042 4. Neither the name of the University nor the names of its contributors 00043 may be used to endorse or promote products derived from this software 00044 without specific prior written permission. 00045 00046 THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 00047 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00048 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00049 ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 00050 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00051 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00052 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00053 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00054 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00055 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00056 SUCH DAMAGE.*/ 00057 00058 /* 00059 * Not available for empire use random.h 00060 * 00061 #include <bits/libc-lock.h> 00062 #include <limits.h> 00063 #include <stddef.h> 00064 #include <stdlib.h> 00065 */ 00066 #include "random.h" 00067 #include "w32misc.h" 00068 00069 00070 /* An improved random number generation package. In addition to the standard 00071 rand()/srand() like interface, this package also has a special state info 00072 interface. The initstate() routine is called with a seed, an array of 00073 bytes, and a count of how many bytes are being passed in; this array is 00074 then initialized to contain information for random number generation with 00075 that much state information. Good sizes for the amount of state 00076 information are 32, 64, 128, and 256 bytes. The state can be switched by 00077 calling the setstate() function with the same array as was initialized 00078 with initstate(). By default, the package runs with 128 bytes of state 00079 information and generates far better random numbers than a linear 00080 congruential generator. If the amount of state information is less than 00081 32 bytes, a simple linear congruential R.N.G. is used. Internally, the 00082 state information is treated as an array of longs; the zeroth element of 00083 the array is the type of R.N.G. being used (small integer); the remainder 00084 of the array is the state information for the R.N.G. Thus, 32 bytes of 00085 state information will give 7 longs worth of state information, which will 00086 allow a degree seven polynomial. (Note: The zeroth word of state 00087 information also has some other information stored in it; see setstate 00088 for details). The random number generation technique is a linear feedback 00089 shift register approach, employing trinomials (since there are fewer terms 00090 to sum up that way). In this approach, the least significant bit of all 00091 the numbers in the state table will act as a linear feedback shift register, 00092 and will have period 2^deg - 1 (where deg is the degree of the polynomial 00093 being used, assuming that the polynomial is irreducible and primitive). 00094 The higher order bits will have longer periods, since their values are 00095 also influenced by pseudo-random carries out of the lower bits. The 00096 total period of the generator is approximately deg*(2**deg - 1); thus 00097 doubling the amount of state information has a vast influence on the 00098 period of the generator. Note: The deg*(2**deg - 1) is an approximation 00099 only good for large deg, when the period of the shift register is the 00100 dominant factor. With deg equal to seven, the period is actually much 00101 longer than the 7*(2**7 - 1) predicted by this formula. */ 00102 00103 00104 00105 /* For each of the currently supported random number generators, we have a 00106 break value on the amount of state information (you need at least this many 00107 bytes of state info to support this random number generator), a degree for 00108 the polynomial (actually a trinomial) that the R.N.G. is based on, and 00109 separation between the two lower order coefficients of the trinomial. */ 00110 00111 /* Linear congruential. */ 00112 #define TYPE_0 0 00113 #define BREAK_0 8 00114 #define DEG_0 0 00115 #define SEP_0 0 00116 00117 /* x**7 + x**3 + 1. */ 00118 #define TYPE_1 1 00119 #define BREAK_1 32 00120 #define DEG_1 7 00121 #define SEP_1 3 00122 00123 /* x**15 + x + 1. */ 00124 #define TYPE_2 2 00125 #define BREAK_2 64 00126 #define DEG_2 15 00127 #define SEP_2 1 00128 00129 /* x**31 + x**3 + 1. */ 00130 #define TYPE_3 3 00131 #define BREAK_3 128 00132 #define DEG_3 31 00133 #define SEP_3 3 00134 00135 /* x**63 + x + 1. */ 00136 #define TYPE_4 4 00137 #define BREAK_4 256 00138 #define DEG_4 63 00139 #define SEP_4 1 00140 00141 00142 /* Array versions of the above information to make code run faster. 00143 Relies on fact that TYPE_i == i. */ 00144 00145 #define MAX_TYPES 5 /* Max number of types above. */ 00146 00147 00148 /* Initially, everything is set up as if from: 00149 initstate(1, randtbl, 128); 00150 Note that this initialization takes advantage of the fact that srandom 00151 advances the front and rear pointers 10*rand_deg times, and hence the 00152 rear pointer which starts at 0 will also end up at zero; thus the zeroth 00153 element of the state information, which contains info about the current 00154 position of the rear pointer is just 00155 (MAX_TYPES * (rptr - state)) + TYPE_3 == TYPE_3. */ 00156 00157 static int32_t randtbl[DEG_3 + 1] = 00158 { 00159 TYPE_3, 00160 00161 -1726662223, 379960547, 1735697613, 1040273694, 1313901226, 00162 1627687941, -179304937, -2073333483, 1780058412, -1989503057, 00163 -615974602, 344556628, 939512070, -1249116260, 1507946756, 00164 -812545463, 154635395, 1388815473, -1926676823, 525320961, 00165 -1009028674, 968117788, -123449607, 1284210865, 435012392, 00166 -2017506339, -911064859, -370259173, 1132637927, 1398500161, 00167 -205601318, 00168 }; 00169 00170 00171 static struct random_data unsafe_state = 00172 { 00173 /* FPTR and RPTR are two pointers into the state info, a front and a rear 00174 pointer. These two pointers are always rand_sep places aparts, as they 00175 cycle through the state information. (Yes, this does mean we could get 00176 away with just one pointer, but the code for random is more efficient 00177 this way). The pointers are left positioned as they would be from the call: 00178 initstate(1, randtbl, 128); 00179 (The position of the rear pointer, rptr, is really 0 (as explained above 00180 in the initialization of randtbl) because the state table pointer is set 00181 to point to randtbl[1] (as explained below).) */ 00182 00183 /* .fptr =*/ &randtbl[SEP_3 + 1], 00184 /* .rptr =*/ &randtbl[1], 00185 /* The following things are the pointer to the state information table, 00186 the type of the current generator, the degree of the current polynomial 00187 being used, and the separation between the two pointers. 00188 Note that for efficiency of random, we remember the first location of 00189 the state information, not the zeroth. Hence it is valid to access 00190 state[-1], which is used to store the type of the R.N.G. 00191 Also, we remember the last location, since this is more efficient than 00192 indexing every time to find the address of the last element to see if 00193 the front and rear pointers have wrapped. */ 00194 00195 /* .state =*/ &randtbl[1], 00196 00197 /* .rand_type =*/ TYPE_3, 00198 /* .rand_deg =*/ DEG_3, 00199 /* .rand_sep =*/ SEP_3, 00200 00201 /* .end_ptr =*/ &randtbl[sizeof (randtbl) / sizeof (randtbl[0])] 00202 }; 00203 00204 /* POSIX.1c requires that there is mutual exclusion for the `rand' and 00205 `srand' functions to prevent concurrent calls from modifying common 00206 data. */ 00207 __libc_lock_define_initialized (static1, lock) 00208 00209 /* Initialize the random number generator based on the given seed. If the 00210 type is the trivial no-state-information type, just remember the seed. 00211 Otherwise, initializes state[] based on the given "seed" via a linear 00212 congruential generator. Then, the pointers are set to known locations 00213 that are exactly rand_sep places apart. Lastly, it cycles the state 00214 information a given number of times to get rid of any initial dependencies 00215 introduced by the L.C.R.N.G. Note that the initialization of randtbl[] 00216 for default usage relies on values produced by this routine. */ 00217 void 00218 __srandom (x) 00219 unsigned int x; 00220 { 00221 __libc_lock_lock (lock); 00222 (void) __srandom_r (x, &unsafe_state); 00223 __libc_lock_unlock (lock); 00224 } 00225 00226 weak_alias (__srandom, srandom) 00227 weak_alias (__srandom, srand) 00228 00229 /* Initialize the state information in the given array of N bytes for 00230 future random number generation. Based on the number of bytes we 00231 are given, and the break values for the different R.N.G.'s, we choose 00232 the best (largest) one we can and set things up for it. srandom is 00233 then called to initialize the state information. Note that on return 00234 from srandom, we set state[-1] to be the type multiplexed with the current 00235 value of the rear pointer; this is so successive calls to initstate won't 00236 lose this information and will be able to restart with setstate. 00237 Note: The first thing we do is save the current state, if any, just like 00238 setstate so that it doesn't matter when initstate is called. 00239 Returns a pointer to the old state. */ 00240 char * 00241 __initstate (seed, arg_state, n) 00242 unsigned int seed; 00243 char *arg_state; 00244 size_t n; 00245 { 00246 int32_t *ostate; 00247 00248 __libc_lock_lock (lock); 00249 00250 ostate = &unsafe_state.state[-1]; 00251 00252 __initstate_r (seed, arg_state, n, &unsafe_state); 00253 00254 __libc_lock_unlock (lock); 00255 00256 return (char *) ostate; 00257 } 00258 00259 weak_alias (__initstate, initstate) 00260 00261 /* Restore the state from the given state array. 00262 Note: It is important that we also remember the locations of the pointers 00263 in the current state information, and restore the locations of the pointers 00264 from the old state information. This is done by multiplexing the pointer 00265 location into the zeroth word of the state information. Note that due 00266 to the order in which things are done, it is OK to call setstate with the 00267 same state as the current state 00268 Returns a pointer to the old state information. */ 00269 char * 00270 __setstate (arg_state) 00271 char *arg_state; 00272 { 00273 int32_t *ostate; 00274 00275 __libc_lock_lock (lock); 00276 00277 ostate = &unsafe_state.state[-1]; 00278 00279 if (__setstate_r (arg_state, &unsafe_state) < 0) 00280 ostate = NULL; 00281 00282 __libc_lock_unlock (lock); 00283 00284 return (char *) ostate; 00285 } 00286 00287 weak_alias (__setstate, setstate) 00288 00289 /* If we are using the trivial TYPE_0 R.N.G., just do the old linear 00290 congruential bit. Otherwise, we do our fancy trinomial stuff, which is the 00291 same in all the other cases due to all the global variables that have been 00292 set up. The basic operation is to add the number at the rear pointer into 00293 the one at the front pointer. Then both pointers are advanced to the next 00294 location cyclically in the table. The value returned is the sum generated, 00295 reduced to 31 bits by throwing away the "least random" low bit. 00296 Note: The code takes advantage of the fact that both the front and 00297 rear pointers can't wrap on the same call by not testing the rear 00298 pointer if the front one has wrapped. Returns a 31-bit random number. */ 00299 00300 long int 00301 __random () 00302 { 00303 int32_t retval; 00304 00305 __libc_lock_lock (lock); 00306 00307 (void) __random_r (&unsafe_state, &retval); 00308 00309 __libc_lock_unlock (lock); 00310 00311 return retval; 00312 } 00313 00314 weak_alias (__random, random)
1.5.2