00001
00011 #ifndef _GK_MKRANDOM_H
00012 #define _GK_MKRANDOM_H
00013
00014 \\
00022 \
00023 #define GK_MKRANDOM(FPRFX, RNGT, VALT)\
00024 \
00025 \
00026 \
00027 void FPRFX ## srand(RNGT seed) \
00028 {\
00029 gk_randinit((uint64_t) seed);\
00030 }\
00031 \
00032 \
00033 \
00034 \
00035 \
00036 RNGT FPRFX ## rand() \
00037 {\
00038 if (sizeof(RNGT) <= sizeof(int32_t)) \
00039 return (RNGT)gk_randint32(); \
00040 else \
00041 return (RNGT)gk_randint64(); \
00042 }\
00043 \
00044 \
00045 \
00046 \
00047 \
00048 RNGT FPRFX ## randInRange(RNGT max) \
00049 {\
00050 return (RNGT)((FPRFX ## rand())%max); \
00051 }\
00052 \
00053 \
00054 \
00055 \
00058 \
00059 void FPRFX ## randArrayPermute(RNGT n, VALT *p, RNGT nshuffles, int flag)\
00060 {\
00061 RNGT i, u, v;\
00062 VALT tmp;\
00063 \
00064 if (flag == 1) {\
00065 for (i=0; i<n; i++)\
00066 p[i] = (VALT)i;\
00067 }\
00068 \
00069 if (n < 10) {\
00070 for (i=0; i<n; i++) {\
00071 v = FPRFX ## randInRange(n);\
00072 u = FPRFX ## randInRange(n);\
00073 gk_SWAP(p[v], p[u], tmp);\
00074 }\
00075 }\
00076 else {\
00077 for (i=0; i<nshuffles; i++) {\
00078 v = FPRFX ## randInRange(n-3);\
00079 u = FPRFX ## randInRange(n-3);\
00080 \
00081 \
00082 \
00083 \
00084 gk_SWAP(p[v+0], p[u+2], tmp);\
00085 gk_SWAP(p[v+1], p[u+3], tmp);\
00086 gk_SWAP(p[v+2], p[u+0], tmp);\
00087 gk_SWAP(p[v+3], p[u+1], tmp);\
00088 }\
00089 }\
00090 }\
00091 \
00092 \
00093 \
00094 \
00097 \
00098 void FPRFX ## randArrayPermuteFine(RNGT n, VALT *p, int flag)\
00099 {\
00100 RNGT i, v;\
00101 VALT tmp;\
00102 \
00103 if (flag == 1) {\
00104 for (i=0; i<n; i++)\
00105 p[i] = (VALT)i;\
00106 }\
00107 \
00108 for (i=0; i<n; i++) {\
00109 v = FPRFX ## randInRange(n);\
00110 gk_SWAP(p[i], p[v], tmp);\
00111 }\
00112 }\
00113
00114
00115 #define GK_MKRANDOM_PROTO(FPRFX, RNGT, VALT)\
00116 void FPRFX ## srand(RNGT seed); \
00117 RNGT FPRFX ## rand(); \
00118 RNGT FPRFX ## randInRange(RNGT max); \
00119 void FPRFX ## randArrayPermute(RNGT n, VALT *p, RNGT nshuffles, int flag);\
00120 void FPRFX ## randArrayPermuteFine(RNGT n, VALT *p, int flag);\
00121
00122
00123 #endif