00001 00016 #ifndef DKUTIL_C_MT_RAND64_H 00017 #define DKUTIL_C_MT_RAND64_H 00018 00019 00020 #ifdef INDEPENDENT_DKC_MT 00021 # include "define.h" 00022 #else 00023 # include <dkutil_c/dkutil_cstd/define.h> 00024 #endif 00025 #include <stdio.h> 00026 00027 #define dkcdMT_RAND64_NN 312 00028 typedef struct dkc_Mersenne_Twister_64bit{ 00030 uint64 state[dkcdMT_RAND64_NN]; 00031 uint64 output[dkcdMT_RAND64_NN]; 00032 int index; 00033 char *mallocPtr; 00034 void *function_ptr; 00035 }DKC_MT_RAND64; 00036 00037 typedef void (*DKC_MT_RAND64_GENERATE_F_TYPE)( DKC_MT_RAND64 * ); 00038 00039 00040 DKC_EXTERN DKC_MT_RAND64 *WINAPI dkcAllocMTRand64(uint64 seed); 00041 00042 DKC_EXTERN int WINAPI dkcFreeMTRand64(DKC_MT_RAND64 **p); 00043 00044 00048 DKC_EXTERN void WINAPI dkcMTRand64Init(DKC_MT_RAND64 *p,uint64 seed); 00052 DKC_EXTERN void WINAPI 00053 dkcMTRand64InitByArray(DKC_MT_RAND64 *p,uint64 *init_key,uint64 key_length); 00054 00055 00056 DKC_EXTERN uint64 WINAPI dkcMTRand64Get(DKC_MT_RAND64 *p); 00057 00058 DKC_EXTERN void dkcMTRand64Next_C(DKC_MT_RAND64 *p); 00059 00063 00064 DKC_INLINE void dkcMTRand64SetNextFunction(DKC_MT_RAND64 *p,DKC_MT_RAND64_GENERATE_F_TYPE f) 00065 { 00066 p->function_ptr = f; 00067 } 00068 00070 DKC_INLINE uint64 dkcMTRand64Get_INL(DKC_MT_RAND64 *p) 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 } 00090 00091 00092 00094 DKC_INLINE int64 dkcMTRand64_Get63(DKC_MT_RAND64 *p) 00095 { 00096 return (int64)(dkcMTRand64Get(p) >> 1); 00097 } 00098 00100 DKC_INLINE double dkcMTRand64_real1(DKC_MT_RAND64 *p) 00101 { 00102 return (dkcMTRand64Get(p) >> 11) * (1.0/9007199254740991.0); 00103 } 00104 00106 DKC_INLINE double dkcMTRand64_real2(DKC_MT_RAND64 *p) 00107 { 00108 return (dkcMTRand64Get(p) >> 11) * (1.0/9007199254740992.0); 00109 } 00110 00112 DKC_INLINE double dkcMTRand64_real3(DKC_MT_RAND64 *p) 00113 { 00114 return ((dkcMTRand64Get(p) >> 12) + 0.5) * (1.0/4503599627370496.0); 00115 } 00116 #endif 00117 00118 00119