1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
// Jason Rohrer
// StdRandomSource.h
/**
*
* Implementation of random number generation that uses stdlib calls
*
*
* Created 12-7-99
* Mods:
* Jason Rohrer 9-28-2000 Added a getRandomBoundedInt()
* implementation
* Jason Rohrer 12-7-2000 Overloaded constructor to support
* specifying a seed.
* Jason Rohrer 12-16-2000 Added a getRandomDouble() function.
* Jason Rohrer 12-17-2000 Fixed bug in initialization of invDMAX
* in default constructor.
* Jason Rohrer 9-13-2001 Fixed a bug in getRandomBoundedInt()
* as floats were being used, and they
* don't provide enough resolution.
* Jason Rohrer 10-11-2002 Fixed some type casting warnings.
* Jason Rohrer 07-09-2006 Added getRandomBoundedDouble.
* Jason Rohrer 07-27-2006 Added getRandomBoolean.
*/
#include "minorGems/common.h"
#ifndef STD_RANDOM_SOURCE_INCLUDED
#define STD_RANDOM_SOURCE_INCLUDED
#include <stdlib.h>
#include <time.h>
#include "RandomSource.h"
class StdRandomSource : public RandomSource {
public:
StdRandomSource(); // needed to seed stdlib generator
// specify the seed for the stdlib generator
StdRandomSource( unsigned int inSeed );
// implements these functions
float getRandomFloat(); // in interval [0,1.0]
double getRandomDouble(); // in interval [0,1.0]
unsigned int getRandomInt(); // in interval [0,MAX]
unsigned int getIntMax(); // returns MAX
int getRandomBoundedInt( int inRangeStart,
int inRangeEnd );
double getRandomBoundedDouble( double inRangeStart,
double inRangeEnd );
char getRandomBoolean();
private:
double mInvMAXPlusOne; // 1 / ( MAX + 1 )
};
inline StdRandomSource::StdRandomSource() {
MAX = RAND_MAX;
srand( (unsigned)time(NULL) );
invMAX = (float)1.0 / ((float)MAX);
invDMAX = 1.0 / ((double)MAX);
mInvMAXPlusOne = 1.0 / ( ( (float)MAX ) + 1.0 );
}
inline StdRandomSource::StdRandomSource( unsigned int inSeed ) {
MAX = RAND_MAX;
srand( inSeed );
invMAX = (float)1.0 / ((float)MAX);
invDMAX = 1.0 / ((double)MAX);
mInvMAXPlusOne = 1.0 / ( ( (double)MAX ) + 1.0 );
}
inline float StdRandomSource::getRandomFloat() {
return (float)(rand()) * invMAX;
}
inline double StdRandomSource::getRandomDouble() {
return (double)(rand()) * invDMAX;
}
inline unsigned int StdRandomSource::getRandomInt() {
return rand();
}
inline unsigned int StdRandomSource::getIntMax() {
return MAX;
}
inline int StdRandomSource::getRandomBoundedInt( int inRangeStart,
int inRangeEnd ) {
// float in range [0,1)
double randFloat = (double)( rand() ) * mInvMAXPlusOne;
int onePastRange = inRangeEnd + 1;
int magnitude = (int)( randFloat * ( onePastRange - inRangeStart ) );
return magnitude + inRangeStart;
}
inline double StdRandomSource::getRandomBoundedDouble( double inRangeStart,
double inRangeEnd ) {
// double in range [0,1]
double randDouble = getRandomDouble();
double magnitude = randDouble * ( inRangeEnd - inRangeStart );
return magnitude + inRangeStart;
}
inline char StdRandomSource::getRandomBoolean() {
// float in range [0,1]
double randFloat = getRandomFloat();
if( randFloat < 0.5 ) {
return true;
}
else {
return false;
}
}
#endif
|