17 # define _USE_MATH_DEFINES
21 # include <sys/syscall.h>
37 "Mersenne Twister (HR)",
52 CRandom * RandomGenerator = NULL;
60 RandomGenerator =
new Cr250(seed);
61 RandomGenerator->
mType = type;
65 RandomGenerator =
new Cmt19937(seed);
66 RandomGenerator->
mType = type;
71 RandomGenerator->
mType = type;
75 RandomGenerator =
new Cmt19937(seed);
76 RandomGenerator->
mType = type;
80 return RandomGenerator;
113 vare.
q[0] = 0.6931472;
114 vare.
q[1] = 0.9333737;
115 vare.
q[2] = 0.9888778;
116 vare.
q[3] = 0.9984959;
117 vare.
q[4] = 0.9998293;
118 vare.
q[5] = 0.9999833;
119 vare.
q[6] = 0.9999986;
120 vare.
q[7] = 0.9999999;
141 ThreadId = (
unsigned C_INT32)(GetCurrentThreadId() & 0xffffffffUL);
142 #elif defined(SYS_thread_selfid)
143 ThreadId = (
unsigned C_INT32)(::
syscall(SYS_thread_selfid) & 0xffffffffUL);
144 #elif defined(SYS_gettid)
145 ThreadId = (
unsigned C_INT32)(::
syscall(SYS_gettid) & 0xffffffffUL);
146 #elif defined(SYS_getthrid)
147 ThreadId = (
unsigned C_INT32)(
syscall(SYS_getthrid) & 0xffffffffUL);
151 ThreadId = (ThreadId & 0x000000ffUL) << 24 | (ThreadId & 0x0000ff00UL) << 8 |
152 (ThreadId & 0x00ff0000UL) >> 8 | (ThreadId & 0xff000000UL) >> 24;
157 unsigned C_INT32 Seed = ThreadId ^ Time;
199 unsigned C_INT32 Max = max + 1;
206 while (NumberU >= Limit);
208 return NumberU % Max;
219 unsigned C_INT32 Max = max + 1;
226 while (NumberU >= Limit);
228 return NumberU % Max;
263 static bool HaveValue =
true;
268 HaveValue = !HaveValue;
271 if (HaveValue)
return SavedValue;
279 while (s >= 1.0 || s == 0);
281 s = sqrt(-2.0 * log(s) / s);
318 if (mu < 10.0)
goto S120;
322 varp.
d = 6.0 * mu * mu;
323 varp.
ll = (long)(mu - 1.1484);
327 if (
varp.
g < 0.0)
goto S20;
345 varp.
b1 = 4.166667E-2 / mu;
351 varp.
c = 0.1069 / mu;
354 if (
varp.
g < 0.0)
goto S50;
368 if (
varp.
t <= -0.6744)
goto S50;
392 if (fabs(
varp.
v) <= 0.25)
goto S90;
415 if (mu >= 0.0)
goto S125;
418 return std::numeric_limits<double>::quiet_NaN();
432 if (
varp.
l == 0)
goto S150;
443 if (
varp.
l == 35)
goto S130;
468 if ((sign > 0.0f && num < 0.0f) || (sign < 0.0f && num > 0.0f))
483 if (
vare.
u < 1.0)
goto S20;
525 x = pow(v2, (1.0 / a));
526 e = v3 * pow(x, (a - 1.0));
534 while (e > pow(x, (a - 1.0)) * exp(-x));
543 c = 1.0 / sqrt(9.0 * d);
557 if (u < 1.0 - 0.0331 * (x * x) * (x * x))
562 if (log(u) < 0.5 * x * x + d * (1.0 - v + log(v)))
unsigned int & syscall(int arg1)
static unsigned C_INT32 getSystemSeed()
virtual C_FLOAT64 getRandomNormal(const C_FLOAT64 &mean, const C_FLOAT64 &sd)
virtual C_FLOAT64 getRandomOO()
virtual C_FLOAT64 getRandomExp()
virtual C_FLOAT64 getRandomStdGamma(C_FLOAT64 shape)
const CRandom::Type & getType() const
virtual C_INT32 getRandomS()
static const char * XMLType[]
virtual C_FLOAT64 getRandomNormal01()
const unsigned C_INT32 & getModulus() const
static const std::string TypeName[]
static CRandom * createGenerator(CRandom::Type type=CRandom::mt19937, unsigned C_INT32 seed=0)
virtual C_FLOAT64 getRandomPoisson(const C_FLOAT64 &mean)
virtual C_FLOAT64 getRandomCC()
virtual C_FLOAT64 getRandomNormalPositive(const C_FLOAT64 &mean, const C_FLOAT64 &sd)
virtual unsigned C_INT32 getRandomU()
void setModulus(const unsigned C_INT32 &modulus)
static CCopasiTimeVariable getCurrentWallTime()
virtual C_FLOAT64 getRandomCO()
C_FLOAT64 fsign(C_FLOAT64 num, C_FLOAT64 sign)
virtual C_FLOAT64 getRandomNormalLog(const C_FLOAT64 &mean, const C_FLOAT64 &sd)
C_INT64 getMicroSeconds(const bool &bounded=false) const
virtual C_FLOAT64 getRandomGamma(C_FLOAT64 shape, C_FLOAT64 scale)
unsigned C_INT32 mModulus
unsigned C_INT32 mNumberU
virtual void initialize(unsigned C_INT32 seed=CRandom::getSystemSeed())