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

dkcMTRand32.h

説明を見る。
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 

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