00001
00011 #include <GKlib.h>
00012
00013
00014
00016
00017 GK_MKRANDOM(gk_c, size_t, char)
00018 GK_MKRANDOM(gk_i, size_t, int)
00019 GK_MKRANDOM(gk_f, size_t, float)
00020 GK_MKRANDOM(gk_d, size_t, double)
00021 GK_MKRANDOM(gk_idx, size_t, gk_idx_t)
00022 GK_MKRANDOM(gk_z, size_t, ssize_t)
00023
00024
00025
00026
00029
00030 #ifdef USE_GKRAND
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #define NN 312
00058 #define MM 156
00059 #define MATRIX_A 0xB5026F5AA96619E9ULL
00060 #define UM 0xFFFFFFFF80000000ULL
00061 #define LM 0x7FFFFFFFULL
00062
00063
00064
00065 static uint64_t mt[NN];
00066
00067 static int mti=NN+1;
00068 #endif
00069
00070
00071 void gk_randinit(uint64_t seed)
00072 {
00073 #ifdef USE_GKRAND
00074 mt[0] = seed;
00075 for (mti=1; mti<NN; mti++)
00076 mt[mti] = (6364136223846793005ULL * (mt[mti-1] ^ (mt[mti-1] >> 62)) + mti);
00077 #else
00078 srand((unsigned int) seed);
00079 #endif
00080 }
00081
00082
00083
00084 uint64_t gk_randint64(void)
00085 {
00086 #ifdef USE_GKRAND
00087 int i;
00088 unsigned long long x;
00089 static uint64_t mag01[2]={0ULL, MATRIX_A};
00090
00091 if (mti >= NN) {
00092
00093
00094 if (mti == NN+1)
00095 gk_randinit(5489ULL);
00096
00097 for (i=0; i<NN-MM; i++) {
00098 x = (mt[i]&UM)|(mt[i+1]&LM);
00099 mt[i] = mt[i+MM] ^ (x>>1) ^ mag01[(int)(x&1ULL)];
00100 }
00101 for (; i<NN-1; i++) {
00102 x = (mt[i]&UM)|(mt[i+1]&LM);
00103 mt[i] = mt[i+(MM-NN)] ^ (x>>1) ^ mag01[(int)(x&1ULL)];
00104 }
00105 x = (mt[NN-1]&UM)|(mt[0]&LM);
00106 mt[NN-1] = mt[MM-1] ^ (x>>1) ^ mag01[(int)(x&1ULL)];
00107
00108 mti = 0;
00109 }
00110
00111 x = mt[mti++];
00112
00113 x ^= (x >> 29) & 0x5555555555555555ULL;
00114 x ^= (x << 17) & 0x71D67FFFEDA60000ULL;
00115 x ^= (x << 37) & 0xFFF7EEE000000000ULL;
00116 x ^= (x >> 43);
00117
00118 return x & 0x7FFFFFFFFFFFFFFF;
00119 #else
00120 return (uint64_t)(((uint64_t) rand()) << 32 | ((uint64_t) rand()));
00121 #endif
00122 }
00123
00124
00125 uint32_t gk_randint32(void)
00126 {
00127 #ifdef USE_GKRAND
00128 return (uint32_t)(gk_randint64() & 0x7FFFFFFF);
00129 #else
00130 return (uint32_t)rand();
00131 #endif
00132 }
00133
00134