annotate mt19937/mt19937ar.c @ 369:6564be3109c5 gcc-4.3-cleanups

gcc-4.3 warning cleanups for lshlib.cpp (I do not believe that any of these changes contain significant copyrightable "intellectual property". However, to the extent that they do, the changes are hereby released into the Public Domain, and may be therefore be used by anyone for any purpose without need for consideration of any kind.)
author mas01cr
date Wed, 12 Nov 2008 15:23:32 +0000
parents d9a88cfd4ab6
children
rev   line source
mas01mc@292 1 /*
mas01mc@292 2 A C-program for MT19937, with initialization improved 2002/1/26.
mas01mc@292 3 Coded by Takuji Nishimura and Makoto Matsumoto.
mas01mc@292 4
mas01mc@292 5 Before using, initialize the state by using init_genrand(seed)
mas01mc@292 6 or init_by_array(init_key, key_length).
mas01mc@292 7
mas01mc@292 8 Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
mas01mc@292 9 All rights reserved.
mas01mc@292 10 Copyright (C) 2005, Mutsuo Saito,
mas01mc@292 11 All rights reserved.
mas01mc@292 12
mas01mc@292 13 Redistribution and use in source and binary forms, with or without
mas01mc@292 14 modification, are permitted provided that the following conditions
mas01mc@292 15 are met:
mas01mc@292 16
mas01mc@292 17 1. Redistributions of source code must retain the above copyright
mas01mc@292 18 notice, this list of conditions and the following disclaimer.
mas01mc@292 19
mas01mc@292 20 2. Redistributions in binary form must reproduce the above copyright
mas01mc@292 21 notice, this list of conditions and the following disclaimer in the
mas01mc@292 22 documentation and/or other materials provided with the distribution.
mas01mc@292 23
mas01mc@292 24 3. The names of its contributors may not be used to endorse or promote
mas01mc@292 25 products derived from this software without specific prior written
mas01mc@292 26 permission.
mas01mc@292 27
mas01mc@292 28 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
mas01mc@292 29 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
mas01mc@292 30 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
mas01mc@292 31 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
mas01mc@292 32 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
mas01mc@292 33 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
mas01mc@292 34 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
mas01mc@292 35 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
mas01mc@292 36 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
mas01mc@292 37 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
mas01mc@292 38 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mas01mc@292 39
mas01mc@292 40
mas01mc@292 41 Any feedback is very welcome.
mas01mc@292 42 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
mas01mc@292 43 email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
mas01mc@292 44 */
mas01mc@292 45
mas01mc@292 46 #include <stdio.h>
mas01mc@292 47 #include "mt19937ar.h"
mas01mc@292 48
mas01mc@292 49 /* Period parameters */
mas01mc@292 50 #define N 624
mas01mc@292 51 #define M 397
mas01mc@292 52 #define MATRIX_A 0x9908b0dfUL /* constant vector a */
mas01mc@292 53 #define UPPER_MASK 0x80000000UL /* most significant w-r bits */
mas01mc@292 54 #define LOWER_MASK 0x7fffffffUL /* least significant r bits */
mas01mc@292 55
mas01mc@292 56 static unsigned long mt[N]; /* the array for the state vector */
mas01mc@292 57 static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */
mas01mc@292 58
mas01mc@292 59 /* initializes mt[N] with a seed */
mas01mc@292 60 void init_genrand(unsigned long s)
mas01mc@292 61 {
mas01mc@292 62 mt[0]= s & 0xffffffffUL;
mas01mc@292 63 for (mti=1; mti<N; mti++) {
mas01mc@292 64 mt[mti] =
mas01mc@292 65 (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
mas01mc@292 66 /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
mas01mc@292 67 /* In the previous versions, MSBs of the seed affect */
mas01mc@292 68 /* only MSBs of the array mt[]. */
mas01mc@292 69 /* 2002/01/09 modified by Makoto Matsumoto */
mas01mc@292 70 mt[mti] &= 0xffffffffUL;
mas01mc@292 71 /* for >32 bit machines */
mas01mc@292 72 }
mas01mc@292 73 }
mas01mc@292 74
mas01mc@292 75 /* initialize by an array with array-length */
mas01mc@292 76 /* init_key is the array for initializing keys */
mas01mc@292 77 /* key_length is its length */
mas01mc@292 78 /* slight change for C++, 2004/2/26 */
mas01mc@292 79 void init_by_array(unsigned long init_key[], int key_length)
mas01mc@292 80 {
mas01mc@292 81 int i, j, k;
mas01mc@292 82 init_genrand(19650218UL);
mas01mc@292 83 i=1; j=0;
mas01mc@292 84 k = (N>key_length ? N : key_length);
mas01mc@292 85 for (; k; k--) {
mas01mc@292 86 mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL))
mas01mc@292 87 + init_key[j] + j; /* non linear */
mas01mc@292 88 mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
mas01mc@292 89 i++; j++;
mas01mc@292 90 if (i>=N) { mt[0] = mt[N-1]; i=1; }
mas01mc@292 91 if (j>=key_length) j=0;
mas01mc@292 92 }
mas01mc@292 93 for (k=N-1; k; k--) {
mas01mc@292 94 mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL))
mas01mc@292 95 - i; /* non linear */
mas01mc@292 96 mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
mas01mc@292 97 i++;
mas01mc@292 98 if (i>=N) { mt[0] = mt[N-1]; i=1; }
mas01mc@292 99 }
mas01mc@292 100
mas01mc@292 101 mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */
mas01mc@292 102 }
mas01mc@292 103
mas01mc@292 104 /* generates a random number on [0,0xffffffff]-interval */
mas01mc@292 105 unsigned long genrand_int32(void)
mas01mc@292 106 {
mas01mc@292 107 unsigned long y;
mas01mc@292 108 static unsigned long mag01[2]={0x0UL, MATRIX_A};
mas01mc@292 109 /* mag01[x] = x * MATRIX_A for x=0,1 */
mas01mc@292 110
mas01mc@292 111 if (mti >= N) { /* generate N words at one time */
mas01mc@292 112 int kk;
mas01mc@292 113
mas01mc@292 114 if (mti == N+1) /* if init_genrand() has not been called, */
mas01mc@292 115 init_genrand(5489UL); /* a default initial seed is used */
mas01mc@292 116
mas01mc@292 117 for (kk=0;kk<N-M;kk++) {
mas01mc@292 118 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
mas01mc@292 119 mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
mas01mc@292 120 }
mas01mc@292 121 for (;kk<N-1;kk++) {
mas01mc@292 122 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
mas01mc@292 123 mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
mas01mc@292 124 }
mas01mc@292 125 y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
mas01mc@292 126 mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
mas01mc@292 127
mas01mc@292 128 mti = 0;
mas01mc@292 129 }
mas01mc@292 130
mas01mc@292 131 y = mt[mti++];
mas01mc@292 132
mas01mc@292 133 /* Tempering */
mas01mc@292 134 y ^= (y >> 11);
mas01mc@292 135 y ^= (y << 7) & 0x9d2c5680UL;
mas01mc@292 136 y ^= (y << 15) & 0xefc60000UL;
mas01mc@292 137 y ^= (y >> 18);
mas01mc@292 138
mas01mc@292 139 return y;
mas01mc@292 140 }
mas01mc@292 141
mas01mc@292 142 /* generates a random number on [0,0x7fffffff]-interval */
mas01mc@292 143 long genrand_int31(void)
mas01mc@292 144 {
mas01mc@292 145 return (long)(genrand_int32()>>1);
mas01mc@292 146 }
mas01mc@292 147
mas01mc@292 148 /* generates a random number on [0,1]-real-interval */
mas01mc@292 149 double genrand_real1(void)
mas01mc@292 150 {
mas01mc@292 151 return genrand_int32()*(1.0/4294967295.0);
mas01mc@292 152 /* divided by 2^32-1 */
mas01mc@292 153 }
mas01mc@292 154
mas01mc@292 155 /* generates a random number on [0,1)-real-interval */
mas01mc@292 156 double genrand_real2(void)
mas01mc@292 157 {
mas01mc@292 158 return genrand_int32()*(1.0/4294967296.0);
mas01mc@292 159 /* divided by 2^32 */
mas01mc@292 160 }
mas01mc@292 161
mas01mc@292 162 /* generates a random number on (0,1)-real-interval */
mas01mc@292 163 double genrand_real3(void)
mas01mc@292 164 {
mas01mc@292 165 return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0);
mas01mc@292 166 /* divided by 2^32 */
mas01mc@292 167 }
mas01mc@292 168
mas01mc@292 169 /* generates a random number on [0,1) with 53-bit resolution*/
mas01mc@292 170 double genrand_res53(void)
mas01mc@292 171 {
mas01mc@292 172 unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;
mas01mc@292 173 return(a*67108864.0+b)*(1.0/9007199254740992.0);
mas01mc@292 174 }
mas01mc@292 175 /* These real versions are due to Isaku Wada, 2002/01/09 added */