PLplot
5.15.0
Toggle main menu visibility
Loading...
Searching...
No Matches
mt19937ar.c
Go to the documentation of this file.
1
//
2
// A C-program for MT19937, with initialization improved 2002/1/26.
3
// Coded by Takuji Nishimura and Makoto Matsumoto.
4
//
5
// Before using, initialize the state by using init_genrand(seed)
6
// or init_by_array(init_key, key_length).
7
//
8
// Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
9
// All rights reserved.
10
// Copyright (C) 2005, Mutsuo Saito,
11
// All rights reserved.
12
//
13
// Redistribution and use in source and binary forms, with or without
14
// modification, are permitted provided that the following conditions
15
// are met:
16
//
17
// 1. Redistributions of source code must retain the above copyright
18
// notice, this list of conditions and the following disclaimer.
19
//
20
// 2. Redistributions in binary form must reproduce the above copyright
21
// notice, this list of conditions and the following disclaimer in the
22
// documentation and/or other materials provided with the distribution.
23
//
24
// 3. The names of its contributors may not be used to endorse or promote
25
// products derived from this software without specific prior written
26
// permission.
27
//
28
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
32
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
33
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
34
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
35
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
36
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
37
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
38
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39
//
40
//
41
// Any feedback is very welcome.
42
// http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
43
// email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
44
//
45
50
51
#include <stdio.h>
52
#include "
mt19937ar.h
"
53
54
// Period parameters
55
#define N 624
56
#define M 397
57
#define MATRIX_A 0x9908b0dfUL
// constant vector a
58
#define UPPER_MASK 0x80000000UL
// most significant w-r bits
59
#define LOWER_MASK 0x7fffffffUL
// least significant r bits
60
61
static
unsigned
long
mt
[
N
];
// the array for the state vector
62
static
int
mti
=
N
+ 1;
// mti==N+1 means mt[N] is not initialized
63
68
void
init_genrand
(
unsigned
long
s )
69
{
70
mt
[0] = s & 0xffffffffUL;
71
for
(
mti
= 1;
mti
<
N
;
mti
++ )
72
{
73
mt
[
mti
] =
74
( 1812433253UL * (
mt
[
mti
- 1] ^ (
mt
[
mti
- 1] >> 30 ) ) + (
unsigned
long)
mti
);
75
// See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier.
76
// In the previous versions, MSBs of the seed affect
77
// only MSBs of the array mt[].
78
// 2002/01/09 modified by Makoto Matsumoto
79
mt
[
mti
] &= 0xffffffffUL;
80
// for >32 bit machines
81
}
82
}
83
90
void
init_by_array
(
unsigned
long
init_key[],
int
key_length )
91
{
92
int
i, j, k;
93
init_genrand
( 19650218UL );
94
i = 1; j = 0;
95
k = (
N
> key_length ?
N
: key_length );
96
for
(; k; k-- )
97
{
98
mt
[i] = (
mt
[i] ^ ( (
mt
[i - 1] ^ (
mt
[i - 1] >> 30 ) ) * 1664525UL ) )
99
+ init_key[j] + (
unsigned
long
) j;
// non linear
100
mt
[i] &= 0xffffffffUL;
// for WORDSIZE > 32 machines
101
i++; j++;
102
if
( i >=
N
)
103
{
104
mt
[0] =
mt
[
N
- 1]; i = 1;
105
}
106
if
( j >= key_length )
107
j = 0;
108
}
109
for
( k =
N
- 1; k; k-- )
110
{
111
mt
[i] = (
mt
[i] ^ ( (
mt
[i - 1] ^ (
mt
[i - 1] >> 30 ) ) * 1566083941UL ) )
112
- (
unsigned
long
) i;
// non linear
113
mt
[i] &= 0xffffffffUL;
// for WORDSIZE > 32 machines
114
i++;
115
if
( i >=
N
)
116
{
117
mt
[0] =
mt
[
N
- 1]; i = 1;
118
}
119
}
120
121
mt
[0] = 0x80000000UL;
// MSB is 1; assuring non-zero initial array
122
}
123
128
unsigned
long
genrand_int32
(
void
)
129
{
130
unsigned
long
y;
131
static
unsigned
long
mag01[2] = { 0x0UL,
MATRIX_A
};
132
// mag01[x] = x * MATRIX_A for x=0,1
133
134
if
(
mti
>=
N
)
// generate N words at one time
135
{
136
int
kk;
137
138
if
(
mti
==
N
+ 1 )
// if init_genrand() has not been called,
139
init_genrand
( 5489UL );
// a default initial seed is used
140
141
for
( kk = 0; kk <
N
-
M
; kk++ )
142
{
143
y = (
mt
[kk] &
UPPER_MASK
) | (
mt
[kk + 1] &
LOWER_MASK
);
144
mt
[kk] =
mt
[kk +
M
] ^ ( y >> 1 ) ^ mag01[y & 0x1UL];
145
}
146
for
(; kk <
N
- 1; kk++ )
147
{
148
y = (
mt
[kk] &
UPPER_MASK
) | (
mt
[kk + 1] &
LOWER_MASK
);
149
mt
[kk] =
mt
[kk + (
M
-
N
)] ^ ( y >> 1 ) ^ mag01[y & 0x1UL];
150
}
151
y = (
mt
[
N
- 1] &
UPPER_MASK
) | (
mt
[0] &
LOWER_MASK
);
152
mt
[
N
- 1] =
mt
[
M
- 1] ^ ( y >> 1 ) ^ mag01[y & 0x1UL];
153
154
mti
= 0;
155
}
156
157
y =
mt
[
mti
++];
158
159
// Tempering
160
y ^= ( y >> 11 );
161
y ^= ( y << 7 ) & 0x9d2c5680UL;
162
y ^= ( y << 15 ) & 0xefc60000UL;
163
y ^= ( y >> 18 );
164
165
return
y;
166
}
167
172
long
genrand_int31
(
void
)
173
{
174
return
(
long
) (
genrand_int32
() >> 1 );
175
}
176
181
double
genrand_real1
(
void
)
182
{
183
return
(
double
)
genrand_int32
() * ( 1.0 / 4294967295.0 );
184
// divided by 2^32-1
185
}
186
191
double
genrand_real2
(
void
)
192
{
193
return
(
double
)
genrand_int32
() * ( 1.0 / 4294967296.0 );
194
// divided by 2^32
195
}
196
201
double
genrand_real3
(
void
)
202
{
203
return
( ( (
double
)
genrand_int32
() ) + 0.5 ) * ( 1.0 / 4294967296.0 );
204
// divided by 2^32
205
}
206
211
double
genrand_res53
(
void
)
212
{
213
unsigned
long
a =
genrand_int32
() >> 5, b =
genrand_int32
() >> 6;
214
return
( (
double
) a * 67108864.0 + (
double
) b ) * ( 1.0 / 9007199254740992.0 );
215
}
216
// These real versions are due to Isaku Wada, 2002/01/09 added
N
#define N
Definition
mt19937ar.c:55
mti
static int mti
Definition
mt19937ar.c:62
genrand_int32
unsigned long genrand_int32(void)
Definition
mt19937ar.c:128
MATRIX_A
#define MATRIX_A
Definition
mt19937ar.c:57
UPPER_MASK
#define UPPER_MASK
Definition
mt19937ar.c:58
LOWER_MASK
#define LOWER_MASK
Definition
mt19937ar.c:59
genrand_real2
double genrand_real2(void)
Definition
mt19937ar.c:191
M
#define M
Definition
mt19937ar.c:56
init_genrand
void init_genrand(unsigned long s)
Definition
mt19937ar.c:68
genrand_int31
long genrand_int31(void)
Definition
mt19937ar.c:172
genrand_real3
double genrand_real3(void)
Definition
mt19937ar.c:201
init_by_array
void init_by_array(unsigned long init_key[], int key_length)
Definition
mt19937ar.c:90
genrand_res53
double genrand_res53(void)
Definition
mt19937ar.c:211
genrand_real1
double genrand_real1(void)
Definition
mt19937ar.c:181
mt
static unsigned long mt[N]
Definition
mt19937ar.c:61
mt19937ar.h
src
mt19937ar.c
Generated on
for PLplot by
1.17.0