00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
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
00058
00059
00060
00061
00062
00063
00064
00065
00066 #ifndef RANDOM_H_JUN_21_2005
00067 #define RANDOM_H_JUN_21_2005
00068
00069 #include <iostream>
00070 using namespace std;
00071
00072
00073 class Random
00074 {
00075 public:
00076 Random() : initNum_(0) {}
00077 ~Random() {}
00078
00079
00080 void init(const long& initNum)
00081 {
00082 if (initNum_ < 0)
00083 {
00084 cout << "WARNING: you can only call Random::init() once. Ignoring call."
00085 << endl;
00086 return;
00087 }
00088
00089 if (initNum >= 0)
00090 {
00091 cout << "Random::init() expects a negative number but is given "
00092 << initNum << endl;
00093 exit(-1);
00094 }
00095
00096 initNum_ = initNum;
00097
00098
00099 num2_ = 123456789;
00100 a_ = 0;
00101
00102 randomA(&initNum_);
00103
00104 }
00105
00106
00107
00108 float random()
00109 {
00110 return randomA(&initNum_);
00111
00112 }
00113
00114
00115 int randomOneOf(const int& a) { return (int) (a * random()); }
00116
00117
00118 private:
00119 float randomA(long* initNum)
00120 {
00121 int c;
00122 long d;
00123 float tmp;
00124
00125 if (*initNum <= 0 || !a_)
00126 {
00127 if (-(*initNum) < 1)
00128 *initNum = 1;
00129 else
00130 *initNum = -(*initNum);
00131
00132 for (c = 32+7; c >= 0; c--)
00133 {
00134 d = (*initNum)/127773;
00135 *initNum = 16807 * (*initNum - d*127773) - 2836*d;
00136
00137 if (*initNum < 0)
00138 *initNum += 2147483647;
00139
00140 if (c < 32)
00141 b_[c] = *initNum;
00142 }
00143 a_ = b_[0];
00144 }
00145 d = (*initNum)/127773;
00146 *initNum = 16807 * (*initNum - d*127773) - 2836*d;
00147 if (*initNum < 0)
00148 *initNum += 2147483647;
00149 c = a_ / (1 + (2147483647-1)/ 32);
00150 a_ = b_[c];
00151 b_[c] = *initNum;
00152 if ((tmp = (1.0/2147483647)*a_) > (1.0 - 1.2e-7))
00153 return (1.0 - 1.2e-7);
00154 else
00155 return tmp;
00156 }
00157
00158
00159 float randomB(long* initNum)
00160 {
00161 int c;
00162 long d;
00163 float tmp;
00164
00165 if (*initNum <= 0)
00166 {
00167 if (-(*initNum) < 1)
00168 *initNum = 1;
00169 else
00170 *initNum = -(*initNum);
00171
00172 num2_ = (*initNum);
00173
00174 for (c = 32+7; c >= 0; c--)
00175 {
00176 d = (*initNum)/53668;
00177 *initNum = 40014 * (*initNum-d*53668) - d*12211;
00178
00179 if (*initNum < 0)
00180 *initNum += 2147483563;
00181
00182 if (c < 32)
00183 b_[c] = *initNum;
00184 }
00185 a_ = b_[0];
00186 }
00187
00188 d = (*initNum)/53668;
00189 *initNum = 40014 * (*initNum-d*53668) - d*12211;
00190 if (*initNum < 0) *initNum += 2147483563;
00191 d = num2_/52774;
00192 num2_ = 40692 * (num2_-d*52774) - d*3791;
00193 if (num2_ < 0)
00194 num2_ += 2147483399;
00195 c = a_ / (1 + (2147483563-1)/32);
00196 a_ = b_[c] - num2_;
00197 b_[c] = *initNum;
00198 if (a_ < 1) a_ += (2147483563-1);
00199 if ((tmp = (1.0/2147483563)*a_) > (1.0 - 1.2e-7))
00200 return (1.0 - 1.2e-7);
00201 else
00202 return tmp;
00203 }
00204
00205
00206 private:
00207 long initNum_;
00208 long num2_;
00209 long a_;
00210 long b_[32];
00211
00212 };
00213
00214
00215 #endif