00001 00027 // 00028 // File Random.hpp: random number generation 00029 // 00030 // 18/02/2000 Manchester 00031 // 00032 00033 00034 #ifndef __RANDOM__ 00035 # define __RANDOM__ 00036 00037 00038 #include <cstdlib> 00039 #include <ctime> 00040 00041 00042 //******************* class Random ******************** 00043 00044 00045 class Random 00046 { 00047 // structure 00048 00049 static int _seed; // currently used random seed 00050 static int _remainingBits; // remaining number if random bits 00051 static const int _bitsPerInt; // number of random bits that can be extracted from one random integer 00052 static int _bits; // integer used for extracting random bits 00053 00054 static int bitsPerInt (); // finds _bitsPerInt; 00055 00056 public: 00057 00058 // maximal random integer 00059 static int max (); 00060 // generate random integer between 0 and max 00061 static int integer (); 00062 // generate random integer between 0 and modulus-1 00063 static int integer ( int modulus ); 00064 // generate random bit (0 or 1) 00065 static int bit (); 00066 // sets the random seed to s 00067 static void seed (int s); 00068 // show the current seed 00069 static int seed (); 00070 // make seed truly random (calls time ()) 00071 static void trulyRandom (); 00072 }; // class Random 00073 00074 00075 //******************* class Random, implementation ******************** 00076 00077 00078 inline 00079 void Random::seed ( int s ) 00080 { 00081 _seed = s; 00082 srand ( s ); 00083 } 00084 00085 00086 inline 00087 int Random::seed () 00088 { 00089 return _seed; 00090 } 00091 00092 00093 inline 00094 int Random::max () 00095 { 00096 return RAND_MAX; 00097 } 00098 00099 00100 inline 00101 int Random::integer () 00102 { 00103 return rand (); 00104 } 00105 00106 00107 inline 00108 int Random::integer ( int modulus ) 00109 { 00110 return integer () % modulus; 00111 } 00112 00113 00114 inline 00115 void Random::trulyRandom () 00116 { 00117 seed ( time ( 0 ) ); 00118 } 00119 00120 00121 inline 00122 int Random::bit () 00123 { 00124 if ( _remainingBits == 0 ) { 00125 _remainingBits = _bitsPerInt; 00126 _bits = integer (); 00127 } 00128 00129 int result = _bits % 2; 00130 _bits /= 2; 00131 _remainingBits --; 00132 00133 return result; 00134 } // Random::bit 00135 00136 00137 #endif 00138 00139