#include "dkcMTRand32.h"
#include "cpu_x86.h"
#include <dkutil_c/dkc_misc.h>
dkcMTRand32.cのインクルード依存関係図
マクロ定義 | |
#define | DKUTIL_C_MT_RAND32_C |
#define | M 397 |
#define | MATRIX_A 0x9908B0DF |
#define | UMASK 0x80000000 |
#define | LMASK 0x7FFFFFFF |
#define | MIXBITS(u, v) ( ((u) & UMASK) | ((v) & LMASK) ) |
#define | TWIST(u, v) ((MIXBITS(u,v) >> 1) ^ ((v)&1 ? MATRIX_A : 0)) |
関数 | |
void | dkcMTRand32Next_C (DKC_MT_RAND32 *mt) |
static DKC_INLINE | next (DKC_MT_RAND32 *mt) |
void WINAPI | dkcMTRand32Init (DKC_MT_RAND32 *mt, uint32 seed) |
void WINAPI | dkcMTRand32InitByArray (DKC_MT_RAND32 *p, uint32 *init_key, int32 key_length) |
DKC_MT_RAND32 *WINAPI | dkcAllocMTRand32 (uint32 seed) |
int WINAPI | dkcFreeMTRand32 (DKC_MT_RAND32 **p) |
uint32 WINAPI | dkcMTRand32Get (DKC_MT_RAND32 *p) |
dkcMTRand32.c で定義されています。
|
dkcMTRand32.c の 5 行で定義されています。 |
|
dkcMTRand32.c の 18 行で定義されています。 |
|
dkcMTRand32.c の 15 行で定義されています。 参照元 dkcMTRand32Next_C(). |
|
dkcMTRand32.c の 16 行で定義されています。 |
|
dkcMTRand32.c の 19 行で定義されています。 |
|
dkcMTRand32.c の 20 行で定義されています。 参照元 dkcMTRand32Next_C(). |
|
dkcMTRand32.c の 17 行で定義されています。 |
|
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.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 }
|
|
dkcMTRand32.c の 63 行で定義されています。 参照先 dkc_Mersenne_Twister_32bit::function_ptr. 00064 { 00065 DKC_MT_RAND32_GENERATE_F_TYPE pf; 00066 pf = mt->function_ptr; 00067 pf(mt); 00068 }
|