00001 #pragma once 00002 #ifndef RANDOM_H 00003 #define RANDOM_H 00004 00005 #include "../../common/normals.h" 00006 #include "../../common/types.h" 00007 #include "RandomGenerator.h" 00008 00009 #include<valarray> 00010 using namespace std; 00011 00012 class Random 00013 { 00014 public: 00015 00017 Random(LongNatural Dimensionality,RandomGenerator* rndGen); 00018 00020 Random(RandomGenerator* rndGen); 00021 00023 inline LongNatural GetDimensionality() const; 00024 00026 Random* clone() const; 00028 inline void GetUniforms(valarray<Real>& variates); 00029 00031 void GetUniform(Real& variate); 00032 00033 void Skip(LongNatural numberOfPaths); 00034 void SetSeed(LongNatural Seed); 00035 void Reset(); 00036 00038 inline void GetGaussians(valarray<Real>& variates); 00040 inline void GetGaussian(Real& variate); 00041 void ResetDimensionality(LongNatural NewDimensionality); 00042 00043 private: 00044 RandomGenerator* InnerGenerator; 00045 LongNatural Dimensionality; 00046 LongNatural InitialSeed; 00047 Real Reciprocal; 00048 }; 00049 00050 LongNatural Random::GetDimensionality() const 00051 { 00052 return Dimensionality; 00053 } 00054 00055 inline void Random::GetGaussians(valarray<Real>& variates) 00056 { 00057 GetUniforms(variates); 00058 00059 for (LongNatural i=0; i < Dimensionality; i++) 00060 { 00061 Real x=variates[i]; 00062 variates[i] = InverseCumulativeNormal(x); 00063 } 00064 } 00065 00066 inline void Random::GetGaussian(Real& variate) 00067 { 00068 GetUniform(variate); 00069 Real x=variate; 00070 variate = InverseCumulativeNormal(x); 00071 } 00072 00073 #endif