00001 00008 #ifndef DKUTIL_C_MT_RAND32_H 00009 #define DKUTIL_C_MT_RAND32_H 00010 00011 #ifdef INDEPENDENT_DKC_MT 00012 # include "define.h" 00013 #else 00014 # include <dkutil_c/dkutil_cstd/define.h> 00015 #endif 00016 #include <stdio.h> 00017 00018 #define dkcdMT_RAND32_N 624 00019 typedef struct dkc_Mersenne_Twister_32bit{ 00021 uint32 state[dkcdMT_RAND32_N]; 00022 uint32 output[dkcdMT_RAND32_N]; 00023 uint32 index; 00024 char *mallocPtr; 00025 void *function_ptr; 00026 }DKC_MT_RAND32; 00027 00028 typedef DKC_MT_RAND32 myMT_t; 00029 00030 00031 00032 DKC_EXTERN DKC_MT_RAND32 *WINAPI dkcAllocMTRand32(uint32 seed); 00033 00034 DKC_EXTERN int WINAPI dkcFreeMTRand32(DKC_MT_RAND32 **p); 00035 00036 00040 DKC_EXTERN void WINAPI dkcMTRand32Init(DKC_MT_RAND32 *p,uint32 seed); 00044 DKC_EXTERN void WINAPI 00045 dkcMTRand32InitByArray(DKC_MT_RAND32 *p,uint32 *init_key,int32 key_length); 00046 00047 00048 DKC_EXTERN uint32 WINAPI dkcMTRand32Get(DKC_MT_RAND32 *p); 00049 00050 00051 typedef void (*DKC_MT_RAND32_GENERATE_F_TYPE)( DKC_MT_RAND32 * ); 00052 DKC_EXTERN void dkcMTRand32Next_C(DKC_MT_RAND32 *p); 00053 DKC_EXTERN void dkcMTRand32Next_MMX(DKC_MT_RAND32 *p); 00054 DKC_EXTERN void dkcMTRand32Next_SSE2(DKC_MT_RAND32 *p); 00055 00056 00061 00062 DKC_INLINE void 00063 dkcMTRand32SetNextFunction(DKC_MT_RAND32 *p,DKC_MT_RAND32_GENERATE_F_TYPE f) 00064 { 00065 p->function_ptr = f; 00066 } 00067 00068 DKC_INLINE uint32 dkcMTRand32Get_INL(DKC_MT_RAND32 *p){ 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 } 00076 00077 00078 00079 /* generates a random number on [0,0x7fffffff]-interval */ 00080 DKC_INLINE long dkcMTRand32Get_int31(DKC_MT_RAND32 *p) 00081 { 00082 return (long)(dkcMTRand32Get_INL(p)>>1); 00083 } 00084 00085 /* generates a random number on [0,1]-real-interval */ 00086 DKC_INLINE double dkcMTRand32Get_real1(DKC_MT_RAND32 *p) 00087 { 00088 return dkcMTRand32Get_INL(p)*(1.0/4294967295.0); 00089 /* divided by 2^32-1 */ 00090 } 00091 00092 /* generates a random number on [0,1)-real-interval */ 00093 DKC_INLINE double dkcMTRand32Get_real2(DKC_MT_RAND32 *p) 00094 { 00095 return dkcMTRand32Get_INL(p)*(1.0/4294967296.0); 00096 /* divided by 2^32 */ 00097 } 00098 00099 /* generates a random number on (0,1)-real-interval */ 00100 DKC_INLINE double dkcMTRand32Get_real3(DKC_MT_RAND32 *p) 00101 { 00102 return (((double)dkcMTRand32Get_INL(p)) + 0.5)*(1.0/4294967296.0); 00103 /* divided by 2^32 */ 00104 } 00105 00106 /* generates a random number on [0,1) with 53-bit resolution*/ 00107 DKC_INLINE double dkcMTRand32Get_res53(DKC_MT_RAND32 *p) 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 } 00113 00114 00115 00116 00117 00118 00119 00120 #endif 00121 00122 00123