// Read the documentation to learn more about C++ code generator // versioning. // %X% %Q% %Z% %W% #ifndef RANDOMGENERATOR #define RANDOMGENERATOR 1 // RandomLuxAdapter #include #include namespace Numerics { void GaussRand(RealArray& gaussSamples); void PoissonRand(RealArray& poissonMeans); void UniformRand(RealArray& randomNumbers); void CauchyRand(RealArray& randomNumbers); template class RandomGenerator { public: ~RandomGenerator(); static RandomGenerator& instance (); void initialize (); void getRandom (std::vector& randNumbers) const; void getRandom (float* randNumbers, int length) const; void getRandom (Real* randNumbers, int length) const; int seed () const; void seed (int value); const std::vector& parHooks () const; void parHooks (const std::vector& value); // Additional Public Declarations protected: RandomGenerator(); // Additional Protected Declarations private: RandomGenerator(const RandomGenerator< T > &right); RandomGenerator< T > & operator=(const RandomGenerator< T > &right); // Additional Private Declarations private: //## implementation // Data Members for Class Attributes int m_seed; std::vector m_parHooks; T* m_generator; // Additional Implementation Declarations }; typedef RandomGenerator< Numerics::RandomLuxAdapter > DefaultRandomGenerator; // Parameterized Class Numerics::RandomGenerator template inline int RandomGenerator::seed () const { return m_seed; } template inline void RandomGenerator::seed (int value) { m_seed = value; } template inline const std::vector& RandomGenerator::parHooks () const { return m_parHooks; } template inline void RandomGenerator::parHooks (const std::vector& value) { m_parHooks = value; } // Parameterized Class Numerics::RandomGenerator template RandomGenerator::RandomGenerator() { m_generator = new T; } template RandomGenerator::~RandomGenerator() { // Remember this is a Meyers Singleton. Destruction must NOT // depend on existence of any other Singletons. delete m_generator; } template RandomGenerator& RandomGenerator::instance () { // The Meyers variation of the Singleton pattern. static RandomGenerator randomGenerator; return randomGenerator; } template void RandomGenerator::initialize () { m_generator->initialize(m_seed, m_parHooks); } template void RandomGenerator::getRandom (std::vector& randNumbers) const { m_generator->getRandom(randNumbers, m_parHooks); } template void RandomGenerator::getRandom (float* randNumbers, int length) const { m_generator->getRandom(randNumbers, length, m_parHooks); } template void RandomGenerator::getRandom (Real* randNumbers, int length) const { m_generator->getRandom(randNumbers, length, m_parHooks); } // Additional Declarations } // namespace Numerics #endif