#include <dkutil_c/dkutil_cstd/define.h>
#include <stdio.h>
dkcMTRand32.hのインクルード依存関係図
このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。
dkcMTRand32.h で定義されています。
|
dkcMTRand32.h の 18 行で定義されています。 参照元 dkcMTRand32Get_INL(), dkcMTRand32Init(), dkcMTRand32InitByArray(), と dkcMTRand32Next_C(). |
|
|
|
dkcMTRand32.h の 51 行で定義されています。 |
|
dkcMTRand32.h の 28 行で定義されています。 |
|
dkcMTRand32.c の 151 行で定義されています。 参照先 dkcMTRand32Init(), dkcMTRand32Next_C(), dkcMTRand32Next_MMX(), dkcMTRand32Next_SSE2(), dkc_Mersenne_Twister_32bit::function_ptr, haveX86_UNIT(), dkc_Mersenne_Twister_32bit::mallocPtr, MU_tMMX, MU_tSSE2, uint32, と uint8. 00152 { 00153 const uint32 alignMask = 15; /* = 2^dkcdMT_RAND32_N - 1 */ 00154 uint8 *tp = dkcAllocateFast_INL(sizeof(DKC_MT_RAND32) + alignMask); 00155 DKC_MT_RAND32 *p; 00156 int unit; 00157 if(NULL==tp) return NULL; 00158 //mymt.cより16byte align technic for SSE 00159 p = (DKC_MT_RAND32 *)(((int)tp + alignMask) & ~alignMask); 00160 p->mallocPtr = (char *)tp; 00161 #if 1 00162 unit = haveX86_UNIT(); 00163 if (unit & MU_tSSE2) { 00164 p->function_ptr = (void *)dkcMTRand32Next_SSE2; 00165 } else if (unit & MU_tMMX) { 00166 p->function_ptr = (void *)dkcMTRand32Next_MMX; 00167 } else { 00168 p->function_ptr = (void *)dkcMTRand32Next_C; 00169 } 00170 #else 00171 p->function_ptr = (void *)dkcMTRand32Next_C; 00172 #endif 00173 dkcMTRand32Init(p,seed); 00174 return p; 00175 }
|
|
dkcMTRand32.c の 177 行で定義されています。
|
|
dkcMTRand32.c の 185 行で定義されています。 参照先 dkcMTRand32Get_INL(). 00185 { 00186 00187 return dkcMTRand32Get_INL(p); 00188 }
|
|
dkcMTRand32.h の 68 行で定義されています。 参照先 dkcdMT_RAND32_N, dkc_Mersenne_Twister_32bit::function_ptr, dkc_Mersenne_Twister_32bit::index, と dkc_Mersenne_Twister_32bit::output. 参照元 dkcMTRand32Get(), dkcMTRand32Get_int31(), dkcMTRand32Get_real1(), dkcMTRand32Get_real2(), dkcMTRand32Get_real3(), と dkcMTRand32Get_res53(). 00068 { 00069 if(p->index >= dkcdMT_RAND32_N){ 00070 DKC_MT_RAND32_GENERATE_F_TYPE pf; 00071 pf = p->function_ptr; 00072 pf(p); 00073 } 00074 return p->output[p->index++]; 00075 }
|
|
dkcMTRand32.h の 80 行で定義されています。 参照先 dkcMTRand32Get_INL(). 00081 { 00082 return (long)(dkcMTRand32Get_INL(p)>>1); 00083 }
|
|
dkcMTRand32.h の 86 行で定義されています。 参照先 dkcMTRand32Get_INL(). 00087 { 00088 return dkcMTRand32Get_INL(p)*(1.0/4294967295.0); 00089 /* divided by 2^32-1 */ 00090 }
|
|
dkcMTRand32.h の 93 行で定義されています。 参照先 dkcMTRand32Get_INL(). 00094 { 00095 return dkcMTRand32Get_INL(p)*(1.0/4294967296.0); 00096 /* divided by 2^32 */ 00097 }
|
|
dkcMTRand32.h の 100 行で定義されています。 参照先 dkcMTRand32Get_INL(). 00101 { 00102 return (((double)dkcMTRand32Get_INL(p)) + 0.5)*(1.0/4294967296.0); 00103 /* divided by 2^32 */ 00104 }
|
|
dkcMTRand32.h の 107 行で定義されています。 参照先 dkcMTRand32Get_INL(). 00108 { 00109 unsigned long a=dkcMTRand32Get_INL(p)>>5; 00110 unsigned long b=dkcMTRand32Get_INL(p)>>6; 00111 return(a*67108864.0+b)*(1.0/9007199254740992.0); 00112 }
|
|
dkcMTRand32.c の 71 行で定義されています。 参照先 dkcdMT_RAND32_N, dkc_Mersenne_Twister_32bit::index, dkc_Mersenne_Twister_32bit::state, と uint32. 参照元 dkcAllocMTRand32(), と dkcMTRand32InitByArray(). 00072 { 00073 uint32 *p; 00074 int i; 00075 00076 p = mt->state; 00077 p[0] = seed; 00078 00079 for (i = 1; i < dkcdMT_RAND32_N; i++) { 00080 p[i] = (1812433253 * (p[i-1] ^ (p[i-1] >> 30)) + i); 00081 /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ 00082 /* In the previous versions, MSBs of the seed affect */ 00083 /* only MSBs of the array state[]. */ 00084 /* 2002/01/09 modified by Makoto Matsumoto */ 00085 p[i] &= 0xffffffffUL; 00086 /* for >32 bit machines */ 00087 } 00088 //update 00089 mt->index = i; 00090 //myMT_Next(mt); 00091 }
|
|
dkcMTRand32.c の 93 行で定義されています。 参照先 dkcdMT_RAND32_N, dkcMTRand32Init(), dkc_Mersenne_Twister_32bit::state, と uint32. 00094 { 00095 int i, j, k; 00096 uint32 *mt = p->state; 00097 //uint32 mti = p->index; 00098 dkcMTRand32Init(p,19650218UL); 00099 i=1; j=0; 00100 k = (dkcdMT_RAND32_N>key_length ? dkcdMT_RAND32_N : key_length); 00101 for (; k; k--) { 00102 mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) 00103 + init_key[j] + j; /* non linear */ 00104 mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ 00105 i++; j++; 00106 if (i>=dkcdMT_RAND32_N) { mt[0] = mt[dkcdMT_RAND32_N-1]; i=1; } 00107 if (j>=key_length) j=0; 00108 } 00109 for (k=dkcdMT_RAND32_N-1; k; k--) { 00110 mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) 00111 - i; /* non linear */ 00112 mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ 00113 i++; 00114 if (i>=dkcdMT_RAND32_N) { mt[0] = mt[dkcdMT_RAND32_N-1]; i=1; } 00115 } 00116 00117 mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ 00118 //update 00119 //next(p); 00120 //p->index = mti; 00121 }
|
|
dkcMTRand32.c の 32 行で定義されています。 参照先 dkcdMT_RAND32_N, dkc_Mersenne_Twister_32bit::index, M, dkc_Mersenne_Twister_32bit::output, dkc_Mersenne_Twister_32bit::state, TWIST, と uint32. 参照元 dkcAllocMTRand32(). 00033 { 00034 int i; 00035 uint32 *p, *q; 00036 00037 p = mt->state; 00038 for (i = 0; i < dkcdMT_RAND32_N - M; i++, p++) { 00039 *p = p[M] ^ TWIST(p[0], p[1]); 00040 } 00041 00042 for (i = 0; i < M - 1; i++, p++) { 00043 *p = p[M-dkcdMT_RAND32_N] ^ TWIST(p[0], p[1]); 00044 } 00045 00046 *p = p[M-dkcdMT_RAND32_N] ^ TWIST(p[0], mt->state[0]); 00047 mt->index = 0; 00048 00049 p = mt->state; 00050 q = mt->output; 00051 for (i = 0; i < dkcdMT_RAND32_N; i++) { 00052 uint32 y; 00053 y = *p++; 00054 /* Tempering */ 00055 y ^= (y >> 11); 00056 y ^= (y << 7) & 0x9D2C5680; 00057 y ^= (y << 15) & 0xEFC60000; 00058 y ^= (y >> 18); 00059 *q++ = y; 00060 } 00061 }
|
|
参照元 dkcAllocMTRand32(). |
|
参照元 dkcAllocMTRand32(). |
|
生成関数を入れる。
dkcMTRand32.h の 63 行で定義されています。 参照先 dkc_Mersenne_Twister_32bit::function_ptr. 00064 { 00065 p->function_ptr = f; 00066 }
|