Geant4 Cross Reference |
1 /* 1 2 Code adapted from: 3 http://www.jstatsoft.org/v05/i08/ 4 5 6 Original disclaimer: 7 8 The ziggurat method for RNOR and REXP 9 Combine the code below with the main program i 10 normal or exponential variates. Then use of 11 will provide a standard normal variate with me 12 while use of REXP in any expression will provi 13 with density exp(-x),x>0. 14 Before using RNOR or REXP in your main, insert 15 zigset(86947731 ); 16 with your own choice of seed value>0, rather t 17 (If you do not invoke zigset(...) you will get 18 For details of the method, see Marsaglia and T 19 for generating random variables", Journ. Stati 20 21 */ 22 23 24 #ifndef RandGaussZiggurat_h 25 #define RandGaussZiggurat_h 1 26 27 #include "cmath" 28 #include "CLHEP/Random/RandGauss.h" 29 #include "CLHEP/Utility/thread_local.h" 30 31 namespace CLHEP { 32 33 /** 34 * @author ATLAS 35 * @ingroup random 36 */ 37 class RandGaussZiggurat : public RandGauss { 38 39 public: 40 41 inline RandGaussZiggurat ( HepRandomEngine& 42 inline RandGaussZiggurat ( HepRandomEngine* 43 44 // Destructor 45 virtual ~RandGaussZiggurat(); 46 47 // Static methods to shoot random values usi 48 49 static inline float shoot() {return ziggurat 50 static inline float shoot( float mean, float 51 52 static void shootArray ( const int size, flo 53 static void shootArray ( const int size, dou 54 55 // Static methods to shoot random values us 56 // by-passing the static generator. 57 58 static inline float shoot( HepRandomEngine* 59 static inline float shoot( HepRandomEngine* 60 61 static void shootArray ( HepRandomEngine* an 62 static void shootArray ( HepRandomEngine* an 63 64 // Instance methods using the localEngine t 65 // generator, and the default mean and stdD 66 67 inline float fire() {return float(ziggurat_R 68 69 inline float fire ( float mean, float stdDev 70 71 void fireArray ( const int size, float* vec 72 void fireArray ( const int size, double* ve 73 void fireArray ( const int size, float* vec 74 void fireArray ( const int size, double* ve 75 76 virtual double operator()(); 77 virtual double operator()( double mean, doub 78 79 // Save and restore to/from streams 80 81 std::ostream & put ( std::ostream & os ) con 82 std::istream & get ( std::istream & is ); 83 84 std::string name() const; 85 HepRandomEngine & engine(); 86 87 static std::string distributionName() {retur 88 // Provides the name of this distribution cl 89 90 static bool ziggurat_init(); 91 protected: 92 ////////////////////////// 93 // Ziggurat Original code: 94 ////////////////////////// 95 //static unsigned long jz,jsr=123456789; 96 // 97 //#define SHR3 (jz=jsr, jsr^=(jsr<<13), jsr^ 98 //#define UNI (.5 + (signed) SHR3*.2328306e- 99 //#define IUNI SHR3 100 // 101 //static long hz; 102 //static unsigned long iz, kn[128], ke[256]; 103 //static float wn[128],fn[128], we[256],fe[2 104 // 105 //#define RNOR (hz=SHR3, iz=hz&127, (fabs(hz 106 //#define REXP (jz=SHR3, iz=jz&255, ( jz 107 108 static CLHEP_THREAD_LOCAL unsigned long kn[1 109 static CLHEP_THREAD_LOCAL float wn[128],fn[1 110 111 static CLHEP_THREAD_LOCAL bool ziggurat_is_i 112 113 static inline unsigned long ziggurat_SHR3(He 114 static inline float ziggurat_UNI(HepRandomEn 115 static inline float ziggurat_RNOR(HepRandomE 116 if(!ziggurat_is_init) ziggurat_init(); 117 long hz=(signed)ziggurat_SHR3(anEngine); 118 unsigned long iz=hz&127; 119 return ((unsigned long)std::abs(hz)<kn[iz] 120 } 121 static float ziggurat_nfix(long hz,HepRandom 122 123 private: 124 125 // Private copy constructor. Defining it her 126 RandGaussZiggurat(const RandGaussZiggurat& d 127 128 // All the engine info, and the default mean 129 // base class. 130 131 }; 132 133 } // namespace CLHEP 134 135 namespace CLHEP { 136 137 RandGaussZiggurat::RandGaussZiggurat(HepRandom 138 { 139 } 140 141 RandGaussZiggurat::RandGaussZiggurat(HepRandom 142 { 143 } 144 145 } // namespace CLHEP 146 147 #endif 148