hp2FEM
0.1
|
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 /*gk_SWAP(p[v+0], p[u+0], tmp);*/\ 00081 /*gk_SWAP(p[v+1], p[u+1], tmp);*/\ 00082 /*gk_SWAP(p[v+2], p[u+2], tmp);*/\ 00083 /*gk_SWAP(p[v+3], p[u+3], tmp);*/\ 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