メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcMTRand32.h

Mersenne Twister algorithm wrapper on 32bit [詳細]

#include <dkutil_c/dkutil_cstd/define.h>
#include <stdio.h>

dkcMTRand32.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

構成

struct  dkc_Mersenne_Twister_32bit

マクロ定義

#define dkcdMT_RAND32_N   624

型定義

typedef dkc_Mersenne_Twister_32bit DKC_MT_RAND32
typedef DKC_MT_RAND32 myMT_t
typedef void(* DKC_MT_RAND32_GENERATE_F_TYPE )(DKC_MT_RAND32 *)

関数

DKC_EXTERN DKC_MT_RAND32
*WINAPI 
dkcAllocMTRand32 (uint32 seed)
DKC_EXTERN int WINAPI dkcFreeMTRand32 (DKC_MT_RAND32 **p)
DKC_EXTERN void WINAPI dkcMTRand32Init (DKC_MT_RAND32 *p, uint32 seed)
DKC_EXTERN void WINAPI dkcMTRand32InitByArray (DKC_MT_RAND32 *p, uint32 *init_key, int32 key_length)
DKC_EXTERN uint32 WINAPI dkcMTRand32Get (DKC_MT_RAND32 *p)
DKC_EXTERN void dkcMTRand32Next_C (DKC_MT_RAND32 *p)
DKC_EXTERN void dkcMTRand32Next_MMX (DKC_MT_RAND32 *p)
DKC_EXTERN void dkcMTRand32Next_SSE2 (DKC_MT_RAND32 *p)
DKC_INLINE void dkcMTRand32SetNextFunction (DKC_MT_RAND32 *p, DKC_MT_RAND32_GENERATE_F_TYPE f)
 生成関数を入れる。
DKC_INLINE uint32 dkcMTRand32Get_INL (DKC_MT_RAND32 *p)
DKC_INLINE long dkcMTRand32Get_int31 (DKC_MT_RAND32 *p)
DKC_INLINE double dkcMTRand32Get_real1 (DKC_MT_RAND32 *p)
DKC_INLINE double dkcMTRand32Get_real2 (DKC_MT_RAND32 *p)
DKC_INLINE double dkcMTRand32Get_real3 (DKC_MT_RAND32 *p)
DKC_INLINE double dkcMTRand32Get_res53 (DKC_MT_RAND32 *p)


説明

Mersenne Twister algorithm wrapper on 32bit

作者:
d金魚
から:
2006/01/18

dkcMTRand32.h で定義されています。


マクロ定義

#define dkcdMT_RAND32_N   624
 

dkcMTRand32.h18 行で定義されています。

参照元 dkcMTRand32Get_INL(), dkcMTRand32Init(), dkcMTRand32InitByArray(), と dkcMTRand32Next_C().


型定義

typedef struct dkc_Mersenne_Twister_32bit DKC_MT_RAND32
 

typedef void(* DKC_MT_RAND32_GENERATE_F_TYPE)(DKC_MT_RAND32 *)
 

dkcMTRand32.h51 行で定義されています。

typedef DKC_MT_RAND32 myMT_t
 

dkcMTRand32.h28 行で定義されています。


関数

DKC_EXTERN DKC_MT_RAND32* WINAPI dkcAllocMTRand32 uint32  seed  ) 
 

dkcMTRand32.c151 行で定義されています。

参照先 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 }

DKC_EXTERN int WINAPI dkcFreeMTRand32 DKC_MT_RAND32 **  p  ) 
 

dkcMTRand32.c177 行で定義されています。

00178 {
00179     dkcFreeFast_INL((void **)(&((*p)->mallocPtr)));
00180     return edk_SUCCEEDED;
00181 }

DKC_EXTERN uint32 WINAPI dkcMTRand32Get DKC_MT_RAND32 p  ) 
 

dkcMTRand32.c185 行で定義されています。

参照先 dkcMTRand32Get_INL().

00185                                               {
00186 
00187     return dkcMTRand32Get_INL(p);
00188 }

DKC_INLINE uint32 dkcMTRand32Get_INL DKC_MT_RAND32 p  ) 
 

dkcMTRand32.h68 行で定義されています。

参照先 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 }

DKC_INLINE long dkcMTRand32Get_int31 DKC_MT_RAND32 p  ) 
 

dkcMTRand32.h80 行で定義されています。

参照先 dkcMTRand32Get_INL().

00081 {
00082     return (long)(dkcMTRand32Get_INL(p)>>1);
00083 }

DKC_INLINE double dkcMTRand32Get_real1 DKC_MT_RAND32 p  ) 
 

dkcMTRand32.h86 行で定義されています。

参照先 dkcMTRand32Get_INL().

00087 {
00088     return dkcMTRand32Get_INL(p)*(1.0/4294967295.0); 
00089     /* divided by 2^32-1 */ 
00090 }

DKC_INLINE double dkcMTRand32Get_real2 DKC_MT_RAND32 p  ) 
 

dkcMTRand32.h93 行で定義されています。

参照先 dkcMTRand32Get_INL().

00094 {
00095     return dkcMTRand32Get_INL(p)*(1.0/4294967296.0); 
00096     /* divided by 2^32 */
00097 }

DKC_INLINE double dkcMTRand32Get_real3 DKC_MT_RAND32 p  ) 
 

dkcMTRand32.h100 行で定義されています。

参照先 dkcMTRand32Get_INL().

00101 {
00102     return (((double)dkcMTRand32Get_INL(p)) + 0.5)*(1.0/4294967296.0); 
00103     /* divided by 2^32 */
00104 }

DKC_INLINE double dkcMTRand32Get_res53 DKC_MT_RAND32 p  ) 
 

dkcMTRand32.h107 行で定義されています。

参照先 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 } 

DKC_EXTERN void WINAPI dkcMTRand32Init DKC_MT_RAND32 p,
uint32  seed
 

警告:
必ずdkcAllocMTRand32()で確保した領域を初期化してください。

dkcMTRand32.c71 行で定義されています。

参照先 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 }

DKC_EXTERN void WINAPI dkcMTRand32InitByArray DKC_MT_RAND32 p,
uint32 *  init_key,
int32  key_length
 

警告:
必ずdkcAllocMTRand32()で確保した領域を初期化してください。

dkcMTRand32.c93 行で定義されています。

参照先 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 }

DKC_EXTERN void dkcMTRand32Next_C DKC_MT_RAND32 p  ) 
 

dkcMTRand32.c32 行で定義されています。

参照先 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 }

DKC_EXTERN void dkcMTRand32Next_MMX DKC_MT_RAND32 p  ) 
 

参照元 dkcAllocMTRand32().

DKC_EXTERN void dkcMTRand32Next_SSE2 DKC_MT_RAND32 p  ) 
 

参照元 dkcAllocMTRand32().

DKC_INLINE void dkcMTRand32SetNextFunction DKC_MT_RAND32 p,
DKC_MT_RAND32_GENERATE_F_TYPE  f
 

生成関数を入れる。

警告:
SSE2やMMXが使用できない環境でdkcMTRand32Next_SSE2()やdkcMTRand32Next_MMX()を入れてはいけない。

dkcMTRand32.h63 行で定義されています。

参照先 dkc_Mersenne_Twister_32bit::function_ptr.

00064 {
00065     p->function_ptr = f;
00066 }


dKingyoMersenneTwisterLibraryに対してThu Jan 19 05:10:25 2006に生成されました。  doxygen 1.4.4