65 #ifndef INCLUDED_numeric_random_mt19937_hh
66 #define INCLUDED_numeric_random_mt19937_hh
106 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
107 #include <inttypes.h>
108 #elif defined(_MSC_VER) || defined(__BORLANDC__)
110 typedef unsigned long long uint64_t;
111 #define inline __inline
113 #include <inttypes.h>
114 #if defined(__GNUC__)
115 #define inline __inline__
122 #if defined(_MSC_VER) || defined(__BORLANDC__)
123 #define PRIu64 "I64u"
124 #define PRIx64 "I64x"
132 #define UINT64_C(v) (v ## ULL)
136 #define DSFMT_MEXP 19937
145 #define DSFMT_N (DSFMT_MEXP / 104)
148 #define DSFMT_N32 (DSFMT_N * 4)
151 #define DSFMT_N64 (DSFMT_N * 2)
190 #define DSFMT_LOW_MASK UINT64_C(0x000FFFFFFFFFFFFF)
191 #define DSFMT_LOW_MASK32_1 0x000fffffU
192 #define DSFMT_LOW_MASK32_2 0xffffffffU
193 #define DSFMT_HIGH_CONST UINT64_C(0x3FF0000000000000)
194 #define DSFMT_HIGH_CONST32 0x3ff00000U
197 #define DSFMT_POS1 36
202 #define DSFMT_MSK1 UINT64_C(0x57fbfffdffff575f)
203 #define DSFMT_MSK2 UINT64_C(0xffff6febffffffee)
204 #define DSFMT_MSK32_1 0x57fbfffdU
205 #define DSFMT_MSK32_2 0xffff575fU
206 #define DSFMT_MSK32_3 0xffff6febU
207 #define DSFMT_MSK32_4 0xffffffeeU
208 #define DSFMT_PCV1 UINT64_C(0x0000000000000001)
209 #define DSFMT_PCV2 UINT64_C(0x000ec8f3d0b00000)
210 #define DSFMT_IDSTR \
211 "dDSFMT-19937:36-29-1-7-16:57fbfffdffff575f-ffff6febffffffee"
249 #if (defined(__BIG_ENDIAN__) || defined(BIG_ENDIAN))
268 out->
u[0] = in->
u[0] << (shift * 8);
269 out->
u[1] = in->
u[1] << (shift * 8);
270 out->
u[1] |= in->
u[0] >> (64 - shift * 8);
292 lung->
u[0] ^= r->
u[0];
293 lung->
u[1] ^= r->
u[1];
305 return (x ^ (x >> 27)) * (
uint32_t)1664525UL;
315 return (x ^ (x >> 27)) * (
uint32_t)1566083941UL;
344 for ( i = 1; i < (
DSFMT_N + 1) * 4; i++ ) {
356 void setSeed( std::string
const & ) { assert(
false ); }
390 for (
int i = 0; i <
DSFMT_N+1; ++i ) {
402 for (
int i = 0; i <
DSFMT_N+1; ++i ) {
417 for ( i = 0; i < (
DSFMT_N + 1) * 2; i++ ) {
440 inner = new_lung[0] & pcv[0];
441 inner ^= new_lung[1] & pcv[1];
442 for ( i = 32; i > 0; i >>= 1 ) {
451 for ( i = 0; i < 2; i++ ) {
453 for ( j = 0; j < 52; j++ ) {
454 if ( (work & pcv[i]) != 0 ) {
480 }
else if ( size >= 68 ) {
482 }
else if ( size >= 39 ) {
487 mid = (size - lag) / 2;
491 if ( key_length + 1 > size ) {
492 count = key_length + 1;
504 for ( i = 1, j = 0; (j <
count) && (j < key_length); j++ ) {
509 r += init_key[
j] + i;
514 for ( ; j <
count; j++ ) {
524 for ( j = 0; j <
size; j++ ) {
580 #endif // INCLUDED_numeric_random_mt19937_HH
static int sformat_idxof(int i)
void period_certification()
BooleanOptionKey const in
StringVectorOptionKey const fix
w128_t sformat[DSFMT_N+1]
ReferenceCount base class – dispatch class.
static uint32_t ini_func2(uint32_t x)
void setSeed(int const iseed)
Set seed and state.
virtual void saveState(std::ostream &out)
Serializes generator state to stream losslessly.
virtual void restoreState(std::istream &in)
Deserializes generator state from stream losslessly.
void setSeed(std::string const &)
Set seed and state.
static void lshift128(w128_t *out, const w128_t *in, int shift)
static uint32_t ini_func1(uint32_t x)
static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c, w128_t *lung)
int is_sformat_initialized
void init_by_array(uint32_t init_key[], int key_length)
BooleanOptionKey const out