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

dkcMTRand64.h

Mersenne Twister algorithm wrapper on 64bit [詳細]

#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


説明

Mersenne Twister algorithm wrapper on 64bit

作者:
d金魚
から:
2006/01/18
TODO:
インライン関数が使えないコンパイラの場合は以下のような規則で書き直してみてください。
#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 で定義されています。


マクロ定義

#define dkcdMT_RAND64_NN   312
 

dkcMTRand64.h27 行で定義されています。

参照元 dkcMTRand64Get_INL().


型定義

typedef struct dkc_Mersenne_Twister_64bit DKC_MT_RAND64
 

typedef void(* DKC_MT_RAND64_GENERATE_F_TYPE)(DKC_MT_RAND64 *)
 

dkcMTRand64.h37 行で定義されています。


関数

DKC_EXTERN DKC_MT_RAND64* WINAPI dkcAllocMTRand64 uint64  seed  ) 
 

dkcMTRand64.c76 行で定義されています。

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

DKC_EXTERN int WINAPI dkcFreeMTRand64 DKC_MT_RAND64 **  p  ) 
 

dkcMTRand64.c90 行で定義されています。

00095 {

DKC_INLINE int64 dkcMTRand64_Get63 DKC_MT_RAND64 p  ) 
 

generates a random number on [0, 2^63-1]-interval

dkcMTRand64.h94 行で定義されています。

参照先 dkcMTRand64Get(), と int64.

00095 {
00096     return (int64)(dkcMTRand64Get(p) >> 1);
00097 }

DKC_INLINE double dkcMTRand64_real1 DKC_MT_RAND64 p  ) 
 

generates a random number on [0,1]-real-interval

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

参照先 dkcMTRand64Get().

00101 {
00102     return (dkcMTRand64Get(p) >> 11) * (1.0/9007199254740991.0);
00103 }

DKC_INLINE double dkcMTRand64_real2 DKC_MT_RAND64 p  ) 
 

generates a random number on [0,1)-real-interval

dkcMTRand64.h106 行で定義されています。

参照先 dkcMTRand64Get().

00107 {
00108     return (dkcMTRand64Get(p) >> 11) * (1.0/9007199254740992.0);
00109 }

DKC_INLINE double dkcMTRand64_real3 DKC_MT_RAND64 p  ) 
 

generates a random number on (0,1)-real-interval

dkcMTRand64.h112 行で定義されています。

参照先 dkcMTRand64Get().

00113 {
00114     return ((dkcMTRand64Get(p) >> 12) + 0.5) * (1.0/4503599627370496.0);
00115 }

DKC_EXTERN uint64 WINAPI dkcMTRand64Get DKC_MT_RAND64 p  ) 
 

generates a random number on [0, 2^64-1]-interval

dkcMTRand64.c174 行で定義されています。

参照元 dkcMTRand64_Get63(), dkcMTRand64_real1(), dkcMTRand64_real2(), と dkcMTRand64_real3().

00179 {

DKC_INLINE uint64 dkcMTRand64Get_INL DKC_MT_RAND64 p  ) 
 

generates a random number on [0, 2^64-1]-interval

dkcMTRand64.h70 行で定義されています。

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

DKC_EXTERN void WINAPI dkcMTRand64Init DKC_MT_RAND64 p,
uint64  seed
 

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

dkcMTRand64.c96 行で定義されています。

00100                                                          {
00101     int mti = p->index;
00102     uint64 *mt = p->state;
00103     p->state[0] = seed;
00104   for (mti=1; mti<NN; mti++)
00105     {

DKC_EXTERN void WINAPI dkcMTRand64InitByArray DKC_MT_RAND64 p,
uint64 *  init_key,
uint64  key_length
 

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

dkcMTRand64.c107 行で定義されています。

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; }

DKC_EXTERN void dkcMTRand64Next_C DKC_MT_RAND64 p  ) 
 

dkcMTRand64.c131 行で定義されています。

参照元 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;

DKC_INLINE void dkcMTRand64SetNextFunction DKC_MT_RAND64 p,
DKC_MT_RAND64_GENERATE_F_TYPE  f
 

生成関数を入れる。

参照:
dkcMTRand32SetNextFunction()の注意書き warningを見てください。

dkcMTRand64.h64 行で定義されています。

参照先 dkc_Mersenne_Twister_64bit::function_ptr.

参照元 dkcAllocMTRand64().

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


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