00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef GRINLIZ_RANDOM_INCLUDED
00027 #define GRINLIZ_RANDOM_INCLUDED
00028
00029 #include "gltypes.h"
00030 #include "gldebug.h"
00031
00032 namespace grinliz {
00033
00039 class Random
00040 {
00041 public:
00043 Random( U32 _seed = 0 );
00044
00050 void SetSeed( U32 _seed );
00051
00053 U16 Rand() { return Randomize(); }
00057 U16 Rand( U16 upperBound ) { return Randomize() % upperBound; }
00058
00062 U16 RandD2( U16 upperBound ) { U16 d1 = upperBound / 2 + 1;
00063 U16 d2 = upperBound - d1 + 1;
00064 U16 r = Rand( d1 ) + Rand( d2 );
00065 GLASSERT( r < upperBound );
00066 return r;
00067 }
00068
00072 U16 RandD3( U16 upperBound ) { U16 d1 = upperBound / 3 + 2;
00073 U16 d2 = upperBound / 3 + 2;
00074 U16 d3 = upperBound - d1 - d2 + 2;
00075 U16 r = Rand( d1 ) + Rand( d2 ) + Rand( d3 );
00076 GLASSERT( r < upperBound );
00077 return r;
00078 }
00079
00081 double DRand( double upper ) { return upper * double( Randomize() ) / 65535.0; }
00082
00084 float FRand( float upper ) { return upper * float( Randomize() ) / 65535.0f; }
00085
00087 bool Boolean() { return Rand( 100 ) >= 50; }
00088
00089 private:
00090 U32 seed;
00091 inline void CalcSeed() { seed = seed * 39421 + 1; }
00092 U16 Randomize();
00093
00094 enum {
00095 TABLESIZE = 16,
00096 SLOTWIDTH = 0x10000 / TABLESIZE
00097 };
00098
00099 U16 seedTable[ TABLESIZE ];
00100 };
00101
00102 };
00103
00104 #endif