92 lines
3.2 KiB
C++
Executable File
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
|