70 lines
3.0 KiB
C++
Executable File
70 lines
3.0 KiB
C++
Executable File
/**********************************************************************
|
|
*<
|
|
FILE: random.h
|
|
|
|
DESCRIPTION: Pseudo-random number generator
|
|
|
|
CREATED BY: Jeff Kowalski
|
|
|
|
HISTORY: Created 11 February 1999
|
|
|
|
*> Copyright (c) 1999, All Rights Reserved.
|
|
**********************************************************************/
|
|
|
|
#ifndef __RANDOM__H
|
|
#define __RANDOM__H
|
|
|
|
/*
|
|
* This class defines a Pseudo-random number generator that precisely
|
|
* matches the behavior of the MSVCRT 6.0 random routines.
|
|
* That is to say, for equivalent calls to ::srand() and Random::srand(),
|
|
* both ::rand() and Random::rand() will produce the same results.
|
|
*
|
|
* The benefit, however, in having this class is that each instantiation
|
|
* is independent, permitting several uncoupled random number generators
|
|
* to be present in the system at once. Moreover, each instantiation
|
|
* is automatically "pre-seeded", making calls to Random::srand unnecessary
|
|
* in most uses. Even arrays of Random items will operate independently.
|
|
*
|
|
* In addition to providing the analogues to the "stdlib" functions, this
|
|
* class also provides two useful member functions which can be used
|
|
* to get a random number bounded in either a float or int interval.
|
|
*/
|
|
class Random {
|
|
private:
|
|
long m_seed;
|
|
|
|
public:
|
|
// The constructor will automatically initialize the seed
|
|
UtilExport Random ();
|
|
|
|
// Analogues of the random rountines from MSVCRT:
|
|
UtilExport void srand (unsigned int seed = 1); // akin to global ::srand
|
|
UtilExport int rand (); // akin to global ::rand
|
|
UtilExport static const int s_rand_max; // akin to global RAND_MAX
|
|
|
|
// Returns a random number in the half-open interval [min, max)
|
|
// such that r=get(max, min) := min <= r < max
|
|
// Note that max is the first arg, and min is the second, permitting
|
|
// one to select, for example, an int in [0,5) = [0,4] with "get(5)"
|
|
// With no arguments, Random::get() is equivalent to Random::rand()
|
|
inline int get (int max_exclusive = s_rand_max+1,
|
|
int min_inclusive = 0) {
|
|
return this->rand() %
|
|
(max_exclusive - min_inclusive) + min_inclusive;
|
|
}
|
|
|
|
// Returns a random number in the half-open interval [min, max)
|
|
// such that r=get(max, min) := min <= r < max
|
|
// Note that max is the first arg, and min is the second, permitting
|
|
// one to select, for example, a float in [0.0, 5.0) with "getf(5)"
|
|
// With no arguments, Random::getf() returns a float in [0.0, 1.0)
|
|
inline float getf (float max_exclusive = 1.0f,
|
|
float min_inclusive = 0.0f) {
|
|
return this->rand() / (s_rand_max+1.0f) *
|
|
(max_exclusive - min_inclusive) + min_inclusive;
|
|
}
|
|
};
|
|
|
|
#endif // __RANDOM__H
|