#include <dkutil_c/dkutil_cstd/define.h>
#include <stdio.h>
dkcMTRand64.hのインクルード依存関係図
このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。
構成 | |
struct | dkc_Mersenne_Twister_64bit |
マクロ定義 | |
#define | dkcdMT_RAND64_NN 312 |
型定義 | |
typedef dkc_Mersenne_Twister_64bit | DKC_MT_RAND64 |
typedef void(* | DKC_MT_RAND64_GENERATE_F_TYPE )(DKC_MT_RAND64 *) |
関数 | |
DKC_EXTERN DKC_MT_RAND64 *WINAPI | dkcAllocMTRand64 (uint64 seed) |
DKC_EXTERN int WINAPI | dkcFreeMTRand64 (DKC_MT_RAND64 **p) |
DKC_EXTERN void WINAPI | dkcMTRand64Init (DKC_MT_RAND64 *p, uint64 seed) |
DKC_EXTERN void WINAPI | dkcMTRand64InitByArray (DKC_MT_RAND64 *p, uint64 *init_key, uint64 key_length) |
DKC_EXTERN uint64 WINAPI | dkcMTRand64Get (DKC_MT_RAND64 *p) |
generates a random number on [0, 2^64-1]-interval | |
DKC_EXTERN void | dkcMTRand64Next_C (DKC_MT_RAND64 *p) |
DKC_INLINE void | dkcMTRand64SetNextFunction (DKC_MT_RAND64 *p, DKC_MT_RAND64_GENERATE_F_TYPE f) |
生成関数を入れる。 | |
DKC_INLINE uint64 | dkcMTRand64Get_INL (DKC_MT_RAND64 *p) |
generates a random number on [0, 2^64-1]-interval | |
DKC_INLINE int64 | dkcMTRand64_Get63 (DKC_MT_RAND64 *p) |
generates a random number on [0, 2^63-1]-interval | |
DKC_INLINE double | dkcMTRand64_real1 (DKC_MT_RAND64 *p) |
generates a random number on [0,1]-real-interval | |
DKC_INLINE double | dkcMTRand64_real2 (DKC_MT_RAND64 *p) |
generates a random number on [0,1)-real-interval | |
DKC_INLINE double | dkcMTRand64_real3 (DKC_MT_RAND64 *p) |
generates a random number on (0,1)-real-interval |
#define dkcMTRand64_real3_base(func,p) \ ( ((func(p) >> 12) + 0.5) * (1.0/4503599627370496.0) ); #define dkcMTRand64_real3(p) dkcMTRand64_real3_base(dkcMTRand64Get,p)
dkcMTRand64.h で定義されています。
|
dkcMTRand64.h の 27 行で定義されています。 参照元 dkcMTRand64Get_INL(). |
|
|
|
dkcMTRand64.h の 37 行で定義されています。 |
|
dkcMTRand64.c の 76 行で定義されています。 参照先 dkcMTRand64Next_C(), dkcMTRand64SetNextFunction(), dkc_Mersenne_Twister_64bit::mallocPtr, と uint32. 00081 { 00082 const uint32 alignMask = 15; /* = 2^n - 1 */ 00083 char *tp = dkcAllocateFast_INL(sizeof(DKC_MT_RAND64) + alignMask); 00084 DKC_MT_RAND64 *p; 00085 if(NULL==tp) return NULL; 00086 //mymt.cより16byte align technic for SSE 00087 p = (DKC_MT_RAND64 *)(((int)tp + alignMask) & ~alignMask); 00088 p->mallocPtr = tp;
|
|
dkcMTRand64.c の 90 行で定義されています。
|
|
generates a random number on [0, 2^63-1]-interval
dkcMTRand64.h の 94 行で定義されています。 参照先 dkcMTRand64Get(), と int64. 00095 { 00096 return (int64)(dkcMTRand64Get(p) >> 1); 00097 }
|
|
generates a random number on [0,1]-real-interval
dkcMTRand64.h の 100 行で定義されています。 参照先 dkcMTRand64Get(). 00101 { 00102 return (dkcMTRand64Get(p) >> 11) * (1.0/9007199254740991.0); 00103 }
|
|
generates a random number on [0,1)-real-interval
dkcMTRand64.h の 106 行で定義されています。 参照先 dkcMTRand64Get(). 00107 { 00108 return (dkcMTRand64Get(p) >> 11) * (1.0/9007199254740992.0); 00109 }
|
|
generates a random number on (0,1)-real-interval
dkcMTRand64.h の 112 行で定義されています。 参照先 dkcMTRand64Get(). 00113 { 00114 return ((dkcMTRand64Get(p) >> 12) + 0.5) * (1.0/4503599627370496.0); 00115 }
|
|
generates a random number on [0, 2^64-1]-interval
dkcMTRand64.c の 174 行で定義されています。 参照元 dkcMTRand64_Get63(), dkcMTRand64_real1(), dkcMTRand64_real2(), と dkcMTRand64_real3().
|
|
generates a random number on [0, 2^64-1]-interval
dkcMTRand64.h の 70 行で定義されています。 参照先 dkcdMT_RAND64_NN, dkc_Mersenne_Twister_64bit::function_ptr, dkc_Mersenne_Twister_64bit::index, dkc_Mersenne_Twister_64bit::output, と uint64. 00071 { 00072 00073 uint64 x; 00074 00075 if (p->index >= dkcdMT_RAND64_NN) { /* generate NN words at one time */ 00076 DKC_MT_RAND64_GENERATE_F_TYPE fp; 00077 fp = p->function_ptr; 00078 fp(p); 00079 } 00080 x = p->output[(p->index)++]; 00081 00082 /* 00083 x ^= (x >> 29) & dkcmUINT64DEFINE(0x5555555555555555); 00084 x ^= (x << 17) & dkcmUINT64DEFINE(0x71D67FFFEDA60000); 00085 x ^= (x << 37) & dkcmUINT64DEFINE(0xFFF7EEE000000000); 00086 x ^= (x >> 43); 00087 */ 00088 return x; 00089 }
|
|
dkcMTRand64.c の 96 行で定義されています。 00100 { 00101 int mti = p->index; 00102 uint64 *mt = p->state; 00103 p->state[0] = seed; 00104 for (mti=1; mti<NN; mti++) 00105 {
|
|
dkcMTRand64.c の 107 行で定義されています。 00112 { 00113 uint64 i, j, k; 00114 uint64 *mt = p->state; 00115 dkcMTRand64Init(p,dkcmUINT64DEFINE(19650218)); 00116 i=1; j=0; 00117 k = (NN>key_length ? NN : key_length); 00118 for (; k; k--) { 00119 mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * dkcmUINT64DEFINE(3935559000370003845))) 00120 + init_key[j] + j; /* non linear */ 00121 i++; j++; 00122 if (i>=NN) { mt[0] = mt[NN-1]; i=1; } 00123 if (j>=key_length) j=0; 00124 } 00125 for (k=NN-1; k; k--) { 00126 mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * dkcmUINT64DEFINE(2862933555777941757))) 00127 - i; /* non linear */ 00128 i++; 00129 if (i>=NN) { mt[0] = mt[NN-1]; i=1; }
|
|
dkcMTRand64.c の 131 行で定義されています。 参照元 dkcAllocMTRand64(). 00135 { 00136 int i; 00137 int mti = p->index; 00138 uint64 *mt = p->state; 00139 uint64 x; 00140 /* if init_genrand64() has not been called, */ 00141 /* a default initial seed is used */ 00142 /*if (mti == NN+1) 00143 dkcMTRand64Init(p,dkcmUINT64DEFINE(5489)); 00144 */ 00145 00146 static uint64 mag01[2]={dkcmUINT64DEFINE(0), MATRIX_A}; 00147 for (i=0;i<NN-MM;i++) { 00148 x = (mt[i]&UM)|(mt[i+1]&LM); 00149 mt[i] = mt[i+MM] ^ (x>>1) ^ mag01[(int)(x&dkcmUINT64DEFINE(1))]; 00150 } 00151 for (;i<NN-1;i++) { 00152 x = (mt[i]&UM)|(mt[i+1]&LM); 00153 mt[i] = mt[i+(MM-NN)] ^ (x>>1) ^ mag01[(int)(x&dkcmUINT64DEFINE(1))]; 00154 } 00155 x = (mt[NN-1]&UM)|(mt[0]&LM); 00156 mt[NN-1] = mt[MM-1] ^ (x>>1) ^ mag01[(int)(x&dkcmUINT64DEFINE(1))]; 00157 00158 mti = 0; 00159 00160 //update 00161 { 00162 uint64 *cache = p->output; 00163 for (i = 0; i < NN; i++) { 00164 register uint64 x; 00165 x = mt[i]; 00166 /* Tempering */ 00167 x ^= (x >> 29) & dkcmUINT64DEFINE(0x5555555555555555); 00168 x ^= (x << 17) & dkcmUINT64DEFINE(0x71D67FFFEDA60000); 00169 x ^= (x << 37) & dkcmUINT64DEFINE(0xFFF7EEE000000000); 00170 x ^= (x >> 43); 00171 cache[i] = x;
|
|
生成関数を入れる。
dkcMTRand64.h の 64 行で定義されています。 参照先 dkc_Mersenne_Twister_64bit::function_ptr. 参照元 dkcAllocMTRand64(). 00065 { 00066 p->function_ptr = f; 00067 }
|