34 std::cerr <<
"error: seed must be positive." << std::endl;
36 std::cout <<
" MT19937 seed = " << s << std::endl;
44 std::cout <<
" MT19937 seed = " << s << std::endl;
53 std::cout <<
" MT19937 seeds = (";
55 for (
int i = 0; i < key.size(); ++i) {
56 std::cout << key[i] <<
", ";
58 std::cout <<
")" << std::endl;
59 init(19650218UL, key);
65 std::cout <<
" Random number: read from file "
66 << filename << std::endl;
68 std::ifstream in_file(filename.c_str());
71 std::cerr <<
"error: unable to open input file." << std::endl;
77 for (
int i = 0; i <
N; ++i) {
81 std::cerr <<
"error: # of seed in input file is lacked." << std::endl;
88 std::cerr <<
"error: # of seed in input file is lacked." << std::endl;
99 std::cout <<
" Random number: write down to file "
100 << filename << std::endl;
102 std::ofstream out_file(filename.c_str());
105 std::cerr <<
"error: unable to open output file." << std::endl;
109 for (
int i = 0; i <
N; ++i) {
110 out_file <<
m_state[i] << std::endl;
113 out_file <<
m_left << std::endl;
122 for (
int j = 1; j <
N; ++j) {
135 int key_length = key.size();
137 for (
int k = N > key_length ? N : key_length; k; --k) {
150 if (j >= key_length) j = 0;
153 for (
int k = N - 1; k; --k) {
176 for (
int j = N -
M + 1; --j; ++p) {
177 *p = p[
M] ^
twist(p[0], p[1]);
179 for (
int j =
M; --j; ++p) {
180 *p = p[
M -
N] ^
twist(p[0], p[1]);
191 const unsigned long mtrx_a = 0x9908b0dfUL;
192 const unsigned long umask = 0x80000000UL;
193 const unsigned long lmask = 0x7fffffffUL;
195 unsigned long maxbits = (u & umask) | (v & lmask);
197 return (maxbits >> 1) ^ (v & 1UL ? mtrx_a : 0UL);
207 unsigned long y = *
m_next++;
211 y ^= (y << 7) & 0x9d2c5680UL;
212 y ^= (y << 15) & 0xefc60000UL;
231 static const double factor = 1.0 / 4294967295.0;
233 return static_cast<double>(
randInt32() * factor);
241 static const double factor = 1.0 / 4294967296.0;
243 return static_cast<double>(
randInt32() * factor);
251 static const double factor = 1.0 / 4294967296.0;
253 return static_cast<double>((
randInt32() + 0.5) * factor);
263 static const double factor = 1.0 / 9007199254740992.0;
266 return (a * 67108864.0 + b) * factor;