* eoRNG.h: Cleanup docs and document /all/ members.
* eoRNG.cpp, eoRNG.h (K, M, N): Declare static and initialize in cpp.
This commit is contained in:
parent
c7ce6e70f3
commit
da50bf0986
3 changed files with 76 additions and 37 deletions
|
|
@ -1,3 +1,9 @@
|
|||
2006-12-02 Jochen Küpper <jochen@fhi-berlin.mpg.de>
|
||||
|
||||
* eoRNG.h: Cleanup docs and document /all/ members.
|
||||
|
||||
* eoRNG.cpp, eoRNG.h (K, M, N): Declare static and initialize in cpp.
|
||||
|
||||
2006-12-01 Jochen Küpper <jochen@fhi-berlin.mpg.de>
|
||||
|
||||
* eoRNG.cpp: Use C++ style cast.
|
||||
|
|
|
|||
|
|
@ -8,7 +8,12 @@
|
|||
|
||||
namespace eo
|
||||
{
|
||||
/// The Global random number generator.
|
||||
// initialize static constants
|
||||
const uint32_t eoRng::K(0x9908B0DFU);
|
||||
const int eoRng::M(397);
|
||||
const int eoRng::N(624);
|
||||
|
||||
// global random number generator object
|
||||
eoRng rng(static_cast<uint32_t>(time(0)));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ would be nice to Cc: <Cokus@math.washington.edu> and
|
|||
<h1>Portability</h1>
|
||||
|
||||
Note for people porting EO to other platforms: please make sure that the type
|
||||
uint32_t in the file eoRng.h is exactly 32 bits long. It may in principle be
|
||||
uint32_t in the file eoRNG.h is exactly 32 bits long. It may in principle be
|
||||
longer, but not shorter. If it is longer, file compatibility between EO on
|
||||
different platforms may be broken.
|
||||
*/
|
||||
|
|
@ -119,12 +119,13 @@ public :
|
|||
@see reseed for details on usage of the seeding value.
|
||||
*/
|
||||
eoRng(uint32_t s)
|
||||
: state(0), next(0), left(-1), cached(false), N(624), M(397), K(0x9908B0DFU)
|
||||
: state(0), next(0), left(-1), cached(false)
|
||||
{
|
||||
state = new uint32_t[N+1];
|
||||
initialize(2*s);
|
||||
}
|
||||
|
||||
/** Destructor */
|
||||
~eoRng()
|
||||
{
|
||||
delete [] state;
|
||||
|
|
@ -160,58 +161,75 @@ public :
|
|||
initialize(s);
|
||||
}
|
||||
|
||||
/**
|
||||
uniform(m = 1.0) returns a random double in the range [0, m)
|
||||
/** Radnom number from unifom distribution
|
||||
|
||||
@param m Define interval for random number to [0, m)
|
||||
@return random number in the range [0, m)
|
||||
*/
|
||||
double uniform(double m = 1.0)
|
||||
{ // random number between [0, m]
|
||||
return m * double(rand()) / double(1.0 + rand_max());
|
||||
}
|
||||
|
||||
/**
|
||||
random() returns a random integer in the range [0, m)
|
||||
/** Radnom integer number from unifom distribution
|
||||
|
||||
@param m Define interval for random number to [0, m)
|
||||
@return random integer in the range [0, m)
|
||||
*/
|
||||
uint32_t random(uint32_t m)
|
||||
{
|
||||
return uint32_t(uniform() * double(m));
|
||||
}
|
||||
|
||||
/**
|
||||
flip() tosses a biased coin such that flip(x/100.0) will
|
||||
returns true x% of the time
|
||||
/** Biased coin toss
|
||||
|
||||
This tosses a biased coin such that flip(x/100.0) will true x% of the time
|
||||
|
||||
@param bias The coins' bias (the \e x above)
|
||||
@return The result of the biased coin toss
|
||||
*/
|
||||
bool flip(double bias=0.5)
|
||||
{
|
||||
return uniform() < bias;
|
||||
}
|
||||
|
||||
/**
|
||||
normal() zero mean gaussian deviate with standard deviation of 1
|
||||
*/
|
||||
double normal(); // gaussian mutation, stdev 1
|
||||
/** Gaussian deviate
|
||||
|
||||
/**
|
||||
normal(stdev) zero mean gaussian deviate with user defined standard deviation
|
||||
Zero mean Gaussian deviate with standard deviation 1.
|
||||
|
||||
@return Random Gaussian deviate
|
||||
*/
|
||||
double normal();
|
||||
|
||||
/** Gaussian deviate
|
||||
|
||||
Gaussian deviate with zero mean and specified standard deviation.
|
||||
|
||||
@param stdev Standard deviation for Gaussian distribution
|
||||
@return Random Gaussian deviate
|
||||
*/
|
||||
double normal(double stdev)
|
||||
{
|
||||
return stdev * normal();
|
||||
}
|
||||
{ return normal(stdev); }
|
||||
|
||||
/**
|
||||
normal(mean, stdev) user defined mean gaussian deviate with user defined standard deviation
|
||||
/** Gaussian deviate
|
||||
|
||||
Gaussian deviate with specified mean and standard deviation.
|
||||
|
||||
@param mean Mean for Gaussian distribution
|
||||
@param stdev Standard deviation for Gaussian distribution
|
||||
@return Random Gaussian deviate
|
||||
*/
|
||||
double normal(double mean, double stdev)
|
||||
{
|
||||
return mean + normal(stdev);
|
||||
}
|
||||
{ return mean + normal(stdev); }
|
||||
|
||||
/**
|
||||
Generates random numbers using a negative exponential distribution
|
||||
/** Random numbers using a negative exponential distribution
|
||||
|
||||
@param mean Mean value of distribution
|
||||
@return Random number from a negative exponential distribution
|
||||
*/
|
||||
double negexp(double mean)
|
||||
{
|
||||
return ( -mean*log((double)rand() / rand_max()));
|
||||
return -mean*log(double(rand()) / rand_max());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -271,7 +289,10 @@ public :
|
|||
TYPE& choice(std::vector<TYPE>& vec)
|
||||
{ return vec[random(vec.size())]; }
|
||||
|
||||
///
|
||||
/** @brief Print RNG
|
||||
|
||||
@param _os Stream to print RNG on
|
||||
*/
|
||||
void printOn(std::ostream& _os) const
|
||||
{
|
||||
for (int i = 0; i < N; ++i)
|
||||
|
|
@ -282,7 +303,10 @@ public :
|
|||
_os << left << ' ' << cached << ' ' << cacheValue;
|
||||
}
|
||||
|
||||
///
|
||||
/** @brief Read RNG
|
||||
|
||||
@param _is Stream to read RNG from
|
||||
*/
|
||||
void readFrom(std::istream& _is)
|
||||
{
|
||||
for (int i = 0; i < N; ++i)
|
||||
|
|
@ -305,7 +329,6 @@ private:
|
|||
|
||||
uint32_t restart();
|
||||
|
||||
|
||||
/* @brief Initialize state
|
||||
|
||||
We initialize state[0..(N-1)] via the generator
|
||||
|
|
@ -355,23 +378,28 @@ private:
|
|||
void initialize(uint32_t seed);
|
||||
|
||||
/** @brief Array for the state */
|
||||
uint32_t* state;
|
||||
uint32_t *state;
|
||||
|
||||
uint32_t* next;
|
||||
/** Pointer to next available random number */
|
||||
uint32_t *next;
|
||||
|
||||
/** Number of random numbers currently left */
|
||||
int left;
|
||||
|
||||
/** @brief Are there cached values for normal distribution? */
|
||||
/** @brief Is there a valid cached value for the normal distribution? */
|
||||
bool cached;
|
||||
|
||||
/** @brief Cached value for normal distribution? */
|
||||
double cacheValue;
|
||||
|
||||
const int N;
|
||||
/** @brief Size of the state-vector */
|
||||
static const int N;
|
||||
|
||||
const int M;
|
||||
/** Internal constant */
|
||||
static const int M;
|
||||
|
||||
/** @brief Magic constant */
|
||||
const uint32_t K;
|
||||
static const uint32_t K;
|
||||
|
||||
|
||||
/** @brief Copy constructor
|
||||
|
|
@ -384,7 +412,7 @@ private:
|
|||
*/
|
||||
eoRng(const eoRng&);
|
||||
|
||||
/** @brief Assignmant operator
|
||||
/** @brief Assignment operator
|
||||
|
||||
@see Copy constructor eoRng(const eoRng&).
|
||||
*/
|
||||
|
|
@ -428,7 +456,7 @@ inline void eoRng::initialize(uint32_t seed)
|
|||
inline uint32_t eoRng::restart()
|
||||
{
|
||||
register uint32_t *p0=state, *p2=state+2, *pM=state+M, s0, s1;
|
||||
register int j;
|
||||
register int j;
|
||||
|
||||
left=N-1, next=state+1;
|
||||
|
||||
|
|
|
|||
Reference in a new issue