Initial commit
This commit is contained in:
91
Torque/SDK/lib/maxsdk40/RandGenerator.h
Normal file
91
Torque/SDK/lib/maxsdk40/RandGenerator.h
Normal file
@@ -0,0 +1,91 @@
|
||||
/**********************************************************************
|
||||
*<
|
||||
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
|
||||
Reference in New Issue
Block a user