tge/lib/maxsdk40/RandGenerator.h
2017-04-17 06:17:10 -06:00

92 lines
3.2 KiB
C++
Executable File

/**********************************************************************
*<
FILE: RandGenerator.h
DESCRIPTION: Generator of random numbers
CREATED BY: Oleg Bayborodin
HISTORY: Nov.17 2000 - created
GOALS: To solve the need in satisfactory generator of random numbers.
DESCRIPTION: The class has interfaces for srand/rand methods of VC++
and other functions for random number generation.
Srand/rand methods from stdlib.h have two main problems:
a) It's not satisfactory random. Since rand() function returns a
pseudorandom integer in the range 0 to 0x7fff=32767, if we
need a lot of random numbers (i.e. for generating 100,000
particles), we are running out of continuity of random num-
bers. Generated random numbers became too discrete.
b) rand() method is global function, not class object. Hence it's
shared between all modules of your plug-in. Changes in one
module may change randomness pattern in other independent
module. To solve this contradiction, rand methods have to be
implemented as a class object.
RandGenerator does exactly that. It has much more random numbers:
RAND_MAX = 0xFFFFFFFF = 4,294,967,295. Also, using instance of
the class, it's much easier to create separate thread of random
numbers for specific module.
*> Copyright (c) 2000, All Rights Reserved.
**********************************************************************/
#ifndef _RANDGENERATOR_H
#define _RANDGENERATOR_H
// to fix conflict between RandGenerator and stdlib.h do the following:
#undef RAND_MAX
const unsigned int RAND_MAX = 0x7fff; // as defined in stdlib.h
class RandGenerator
{
public:
CoreExport RandGenerator(); // constructor
// override for VC++ rand methods
CoreExport static const DWORD32 RAND_MAX;
// The srand function sets the starting point for generating a
// series of pseudorandom integers. To reinitialize the generator,
// use 1 as the seed argument. Any other value for seed sets the
// generator to a random starting point. rand() retrieves the
// pseudorandom numbers that are generated. Calling rand() before
// any call to srand() generates the same sequence as calling srand()
// with seed passed as 1.
CoreExport void srand(DWORD32 seed);
// The rand function returns a pseudorandom integer in the range 0 to RAND_MAX
CoreExport DWORD32 rand( void );
// other useful functions:
// random sign { -1, 1 }
CoreExport int RandSign( void );
// random number between 0.0f and 1.0f
CoreExport float Rand01( void );
// random number between -1.0f and 1.0f
CoreExport float Rand11( void );
// random number between -0.5f and 0.5f
CoreExport float Rand55( void );
// integer random number between 0 and maxnum
CoreExport int Rand0X(int maxnum);
// to check out if the generator has been explicitely initialized
// by srand() method
const bool Valid( void ) const { return m_explicitelyInitialized; }
private:
static const DWORD32 kMagicNumber1, kMagicNumber2;
static const DWORD32 HALF_RAND_MAX;
static const double kIntMax, kIntMax1, kHalfIntMax;
DWORD32 m_randar[256];
DWORD32 m_randX, m_randY;
bool m_explicitelyInitialized;
};
#endif