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
00027
00028
00029 #ifndef GL_RANDOM_INCLUDED
00030 #define GL_RANDOM_INCLUDED
00031
00032 #include "gltypes.h"
00033 #include "gldebug.h"
00034 #include <stdlib.h>
00035
00041 class GlRandom
00042 {
00043 public:
00045 GlRandom( U32 _seed = 0 );
00046
00052 void SetSeed( U32 _seed );
00053
00055 U16 Rand() { return Randomize(); }
00059 U16 Rand( U16 upperBound ) { return Randomize() % upperBound; }
00060
00064 U16 RandD2( U16 upperBound ) { U16 d1 = upperBound / 2 + 1;
00065 U16 d2 = upperBound - d1 + 1;
00066 U16 r = Rand( d1 ) + Rand( d2 );
00067 GLASSERT( r < upperBound );
00068 return r;
00069 }
00070
00074 U16 RandD3( U16 upperBound ) { U16 d1 = upperBound / 3 + 2;
00075 U16 d2 = upperBound / 3 + 2;
00076 U16 d3 = upperBound - d1 - d2 + 2;
00077 U16 r = Rand( d1 ) + Rand( d2 ) + Rand( d3 );
00078 GLASSERT( r < upperBound );
00079 return r;
00080 }
00081
00083 double DRand( double upper ) { return upper * double( Randomize() ) / 65535.0; }
00084
00086 float FRand( float upper ) { return upper * float( Randomize() ) / 65535.0f; }
00087
00089 bool Boolean() { return Rand( 100 ) >= 50; }
00090
00091 private:
00092 U32 seed;
00093 inline void CalcSeed() { seed = seed * 39421 + 1; }
00094 U16 Randomize();
00095
00096 enum {
00097 TABLESIZE = 16,
00098 SLOTWIDTH = 0x10000 / TABLESIZE
00099 };
00100
00101 U16 seedTable[ TABLESIZE ];
00102 };
00103
00104
00105 #endif