Some random number genertion codes for some distributions
// The state vector for generation of random numbers.
char rngState[256];
// Initialize the random number generator.
void initRandom(){
initstate(2, rngState, 256);
}
// Generate a random integer in the range [rangeStart,
// rangeEnd]. Inputs must satisfy: rangeStart <= rangeEnd.
IntC genRandomInt(IntC rangeStart, IntC rangeEnd){
if(!(rangeStart <= rangeEnd)) return -1;
IntC r;
r = rangeStart + (IntC)((rangeEnd - rangeStart + 1.0) * random() / (RAND_MAX + 1
.0));
return r;
}
// Generate a random 32-bits unsigned (Uns32C) in the range
// [rangeStart, rangeEnd]. Inputs must satisfy: rangeStart <=
// rangeEnd.
Uns32C genRandomUns32(Uns32C rangeStart, Uns32C rangeEnd){
Uns32C r;
if (RAND_MAX >= rangeEnd - rangeStart) {
r = rangeStart + (Uns32C)((rangeEnd - rangeStart + 1.0) * random() / (RAND_MAX
+ 1.0));
} else {
r = rangeStart + (Uns32C)((rangeEnd - rangeStart + 1.0) * ((LongUns64C)random(
) * ((LongUns64C)RAND_MAX + 1) + (LongUns64C)random()) / ((LongUns64C)RAND_MAX * (
(LongUns64C)RAND_MAX + 1) + (LongUns64C)RAND_MAX + 1.0));
}
return r;
}
// Generate a random real distributed uniformly in [rangeStart,
// rangeEnd]. Input must satisfy: rangeStart <= rangeEnd. The
// granularity of generated random reals is given by RAND_MAX.
RealC genUniformRandom(RealC rangeStart, RealC rangeEnd){
RealC r;
r = rangeStart + ((rangeEnd - rangeStart) * (RealC)random() / (RealC)RAND_MAX);
return r;
}
// Generate a random real from normal distribution N(0,1).
RealC genGaussianRandom(){
// Use Box-Muller transform to generate a point from normal
// distribution.
RealC x1, x2;
do{ x1 = genUniformRandom(0.0, 1.0); } while (x1 == 0); // cannot take log o
f 0.
x2 = genUniformRandom(0.0, 1.0);
RealC z;
z = SQRT(-2.0 * log(x1)) * COS(2.0 * M_PI * x2);
return z;
}
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment