ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/rng_mt.c
Revision: 7668
Committed: Wed Jul 20 17:09:49 2016 UTC (9 years, 1 month ago) by michael
Content type: text/x-csrc
File size: 4916 byte(s)
Log Message:
- Fixed svn properties

File Contents

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

Properties

Name Value
svn:eol-style native
svn:keywords Id