00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "RandGauss.h"
00035
00036 RandGauss::~RandGauss() {
00037 if ( deleteEngine ) delete localEngine;
00038 }
00039
00040 HepDouble RandGauss::operator()() {
00041 return fire();
00042 }
00043
00044 HepDouble RandGauss::shoot()
00045 {
00046
00047
00048
00049 if ( getFlag() ) {
00050 setFlag(false);
00051 return getVal();
00052 }
00053
00054 register HepDouble r;
00055 HepDouble v1,v2,fac,val;
00056
00057 do {
00058 v1 = 2.0 * HepRandom::getTheGenerator()->flat() - 1.0;
00059 v2 = 2.0 * HepRandom::getTheGenerator()->flat() - 1.0;
00060 r = v1*v1 + v2*v2;
00061 } while ( r > 1.0 );
00062
00063 fac = ::sqrt(-2.0*::log(r)/r);
00064 val = v1*fac;
00065 setVal(val);
00066 setFlag(true);
00067 return v2*fac;
00068 }
00069
00070 void RandGauss::shootArray( const HepInt size, HepDouble* vect,
00071 HepDouble mean, HepDouble stdDev )
00072 {
00073 register HepInt i;
00074
00075 for (i=0; i<size; ++i)
00076 vect[i] = shoot(mean,stdDev);
00077 }
00078
00079 void
00080 #ifndef ST_NO_TEMPLATE_DEF_ARGS
00081 RandGauss::shootArray( vector<HepDouble>& vec,
00082 HepDouble mean, HepDouble stdDev )
00083 #else
00084 RandGauss::shootArray( vector<HepDouble,allocator<HepDouble> >& vec,
00085 HepDouble mean, HepDouble stdDev )
00086 #endif
00087 {
00088 for (unsigned int i=0; i<vec.size(); ++i)
00089 vec[i] = shoot(mean,stdDev);
00090 }
00091
00092 HepDouble RandGauss::shoot( HepRandomEngine* anEngine )
00093 {
00094
00095
00096
00097 if ( getFlag() ) {
00098 setFlag(false);
00099 return getVal();
00100 }
00101
00102 register HepDouble r;
00103 HepDouble v1,v2,fac,val;
00104
00105 do {
00106 v1 = 2.0 * anEngine->flat() - 1.0;
00107 v2 = 2.0 * anEngine->flat() - 1.0;
00108 r = v1*v1 + v2*v2;
00109 } while ( r > 1.0 );
00110
00111 fac = ::sqrt( -2.0*::log(r)/r);
00112 val = v1*fac;
00113 setVal(val);
00114 setFlag(true);
00115 return v2*fac;
00116 }
00117
00118 void RandGauss::shootArray( HepRandomEngine* anEngine,
00119 const HepInt size, HepDouble* vect,
00120 HepDouble mean, HepDouble stdDev )
00121 {
00122 register HepInt i;
00123
00124 for (i=0; i<size; ++i)
00125 vect[i] = shoot(anEngine,mean,stdDev);
00126 }
00127
00128 void
00129 #ifndef ST_NO_TEMPLATE_DEF_ARGS
00130 RandGauss::shootArray( HepRandomEngine* anEngine,
00131 vector<HepDouble>& vec,
00132 HepDouble mean, HepDouble stdDev )
00133 #else
00134 RandGauss::shootArray( HepRandomEngine* anEngine,
00135 vector<HepDouble,allocator<HepDouble> >& vec,
00136 HepDouble mean, HepDouble stdDev )
00137 #endif
00138 {
00139 for (unsigned int i=0; i<vec.size(); ++i)
00140 vec[i] = shoot(anEngine,mean,stdDev);
00141 }
00142
00143
00144 HepDouble RandGauss::fire()
00145 {
00146
00147
00148
00149 if ( set ) {
00150 set = false;
00151 return nextGauss;
00152 }
00153
00154 register HepDouble r;
00155 HepDouble v1,v2,fac,val;
00156
00157 do {
00158 v1 = 2.0 * localEngine->flat() - 1.0;
00159 v2 = 2.0 * localEngine->flat() - 1.0;
00160 r = v1*v1 + v2*v2;
00161 } while ( r > 1.0 );
00162
00163 fac = ::sqrt(-2.0*::log(r)/r);
00164 val = v1*fac;
00165 nextGauss = val;
00166 set = true;
00167 return v2*fac;
00168 }
00169
00170 void RandGauss::fireArray( const HepInt size, HepDouble* vect,
00171 HepDouble mean, HepDouble stdDev )
00172 {
00173 register HepInt i;
00174
00175 for (i=0; i<size; ++i)
00176 vect[i] = fire(mean,stdDev);
00177 }
00178
00179 void
00180 #ifndef ST_NO_TEMPLATE_DEF_ARGS
00181 RandGauss::fireArray( vector<HepDouble>& vec,
00182 HepDouble mean, HepDouble stdDev )
00183 #else
00184 RandGauss::fireArray( vector<HepDouble,allocator<HepDouble> >& vec,
00185 HepDouble mean, HepDouble stdDev )
00186 #endif
00187 {
00188 for (unsigned int i=0; i<vec.size(); ++i)
00189 vec[i] = fire(mean,stdDev);
00190 }