12#include "CLHEP/Random/defs.h"
13#include "CLHEP/Random/DoubConv.h"
15#include "CLHEP/Random/RandExpZiggurat.h"
40 return fire( defaultMean );
45 for (
int i=0; i<size; ++i) vect[i] =
shoot(mean);
50 for (
int i=0; i<size; ++i) vect[i] =
shoot(mean);
55 for (
int i=0; i<size; ++i) vect[i] =
shoot(anEngine, mean);
60 for (
int i=0; i<size; ++i) vect[i] =
shoot(anEngine, mean);
65 for (
int i=0; i<size; ++i) vect[i] =
fire( defaultMean );
70 for (
int i=0; i<size; ++i) vect[i] =
fire( defaultMean );
75 for (
int i=0; i<size; ++i) vect[i] =
fire( mean );
80 for (
int i=0; i<size; ++i) vect[i] =
fire( mean );
84 long pr=os.precision(20);
85 std::vector<unsigned long> t(2);
86 os <<
" " <<
name() <<
"\n";
89 os << defaultMean <<
" " << t[0] <<
" " << t[1] <<
"\n";
93 long pr=os.precision(20);
94 os <<
" " <<
name() <<
"\n";
95 os << defaultMean <<
"\n";
104 if (inName !=
name()) {
105 is.clear(std::ios::badbit | is.rdstate());
106 std::cerr <<
"Mismatch when expecting to read state of a "
107 <<
name() <<
" distribution\n"
108 <<
"Name found was " << inName
109 <<
"\nistream is left in the badbit state\n";
113 std::vector<unsigned long> t(2);
126 unsigned long iz=jz&255;
131 if(iz==0)
return (7.69711-std::log(
ziggurat_UNI(anEngine)));
138 if(jz<
ke[iz])
return (jz*
we[iz]);
144 const double rzm1 = 2147483648.0, rzm2 = 4294967296.;
145 double dn=3.442619855899,tn=dn,vn=9.91256303526217e-3, q;
146 double de=7.697117470131487, te=de, ve=3.949659822581572e-3;
150 q=vn/std::exp(-.5*dn*dn);
151 kn[0]=(
unsigned long)((dn/q)*rzm1);
158 fn[127]=std::exp(-.5*dn*dn);
160 for(i=126;i>=1;i--) {
161 dn=std::sqrt(-2.*std::log(vn/dn+std::exp(-.5*dn*dn)));
162 kn[i+1]=(
unsigned long)((dn/tn)*rzm1);
164 fn[i]=std::exp(-.5*dn*dn);
169 q = ve/std::exp(-de);
170 ke[0]=(
unsigned long)((de/q)*rzm2);
177 fe[255]=std::exp(-de);
179 for(i=254;i>=1;i--) {
180 de=-std::log(ve/de+std::exp(-de));
181 ke[i+1]= (
unsigned long)((de/te)*rzm2);
static double longs2double(const std::vector< unsigned long > &v)
static std::vector< unsigned long > dto2longs(double d)
static CLHEP_THREAD_LOCAL float fn[128]
static bool ziggurat_init()
static unsigned long ziggurat_SHR3(HepRandomEngine *anEngine)
static CLHEP_THREAD_LOCAL unsigned long ke[256]
static void shootArray(const int size, float *vect, float mean=1.0)
static CLHEP_THREAD_LOCAL float fe[256]
HepRandomEngine & engine()
static float ziggurat_efix(unsigned long jz, HepRandomEngine *anEngine)
virtual ~RandExpZiggurat()
std::istream & get(std::istream &is)
static CLHEP_THREAD_LOCAL float wn[128]
RandExpZiggurat(HepRandomEngine &anEngine, double mean=1.0)
virtual double operator()()
static CLHEP_THREAD_LOCAL float we[256]
static CLHEP_THREAD_LOCAL unsigned long kn[128]
void fireArray(const int size, float *vect)
static float ziggurat_UNI(HepRandomEngine *anEngine)
static CLHEP_THREAD_LOCAL bool ziggurat_is_init
std::ostream & put(std::ostream &os) const
bool possibleKeywordInput(IS &is, const std::string &key, T &t)