134 lines
4.3 KiB
C++
134 lines
4.3 KiB
C++
// -*- C++ -*-
|
|
//
|
|
// -----------------------------------------------------------------------
|
|
// HEP Random
|
|
// --- RandFlat ---
|
|
// inlined functions implementation file
|
|
// -----------------------------------------------------------------------
|
|
// This file is part of Geant4 (simulation toolkit for HEP).
|
|
|
|
// =======================================================================
|
|
// Gabriele Cosmo - Created: 5th September 1995
|
|
// Peter Urban - ShootBit() and related stuff added: 5th Sep 1996
|
|
// Gabriele Cosmo - Additional methods to fill arrays specifying
|
|
// boundaries: 24th Jul 1997
|
|
// - Fixed bug in shootInt(m,n): 25th Sep 1997
|
|
// J.Marraffino - Added default arguments as attributes: 16th Feb 1998
|
|
// M.Fischler - Corrected initialization of deleteEngine which should
|
|
// be true for all constructors taking HepRandomEngine*.
|
|
// =======================================================================
|
|
|
|
namespace CLHEP {
|
|
|
|
inline RandFlat::RandFlat(HepRandomEngine & anEngine)
|
|
: HepRandom(), firstUnusedBit(0), localEngine(&anEngine, do_nothing_deleter()),
|
|
defaultWidth(1.0), defaultA(0.0), defaultB(1.0) {}
|
|
|
|
inline RandFlat::RandFlat(HepRandomEngine & anEngine, double width )
|
|
: HepRandom(), firstUnusedBit(0), localEngine(&anEngine, do_nothing_deleter()),
|
|
defaultWidth(width), defaultA(0.0), defaultB(width) {}
|
|
|
|
inline RandFlat::RandFlat(HepRandomEngine & anEngine, double a,
|
|
double b )
|
|
: HepRandom(), firstUnusedBit(0), localEngine(&anEngine, do_nothing_deleter()),
|
|
defaultWidth(b-a), defaultA(a), defaultB(b) {}
|
|
|
|
inline RandFlat::RandFlat(HepRandomEngine * anEngine)
|
|
: HepRandom(), firstUnusedBit(0), localEngine(anEngine),
|
|
defaultWidth(1.0), defaultA(0.0), defaultB(1.0) {}
|
|
|
|
inline RandFlat::RandFlat(HepRandomEngine * anEngine, double width )
|
|
: HepRandom(), firstUnusedBit(0), localEngine(anEngine),
|
|
defaultWidth(width), defaultA(0.0), defaultB(width) {}
|
|
|
|
inline RandFlat::RandFlat(HepRandomEngine * anEngine, double a,
|
|
double b )
|
|
: HepRandom(), firstUnusedBit(0), localEngine(anEngine),
|
|
defaultWidth(b-a), defaultA(a), defaultB(b) {}
|
|
|
|
inline double RandFlat::shoot(double a, double b) {
|
|
return (b-a)* shoot() + a;
|
|
}
|
|
|
|
inline double RandFlat::shoot(double width) {
|
|
return width * shoot();
|
|
}
|
|
|
|
inline long RandFlat::shootInt(long n) {
|
|
return long(shoot()*double(n));
|
|
}
|
|
|
|
inline long RandFlat::shootInt(long a1, long n) {
|
|
return long(shoot()*double(n-a1)) + a1;
|
|
}
|
|
|
|
//---------------------
|
|
|
|
inline double RandFlat::shoot(HepRandomEngine* anEngine) {
|
|
return anEngine->flat();
|
|
}
|
|
|
|
|
|
inline double RandFlat::shoot(HepRandomEngine* anEngine,
|
|
double a, double b) {
|
|
return (b-a)* anEngine->flat() + a;
|
|
}
|
|
|
|
inline double RandFlat::shoot(HepRandomEngine* anEngine,
|
|
double width) {
|
|
return width * anEngine->flat();
|
|
}
|
|
|
|
inline long RandFlat::shootInt(HepRandomEngine* anEngine,
|
|
long n) {
|
|
return long(anEngine->flat()*double(n));
|
|
}
|
|
|
|
inline long RandFlat::shootInt(HepRandomEngine* anEngine,
|
|
long a1, long n) {
|
|
return long(double(n-a1)*anEngine->flat()) + a1;
|
|
}
|
|
|
|
inline void RandFlat::shootArray(HepRandomEngine* anEngine,
|
|
const int size, double* vect) {
|
|
anEngine->flatArray(size,vect);
|
|
}
|
|
|
|
//---------------------
|
|
|
|
inline double RandFlat::fire() {
|
|
return (defaultB-defaultA)*localEngine->flat()+defaultA;
|
|
}
|
|
|
|
inline double RandFlat::fire(double a, double b) {
|
|
return (b-a)* localEngine->flat() + a;
|
|
}
|
|
|
|
inline double RandFlat::fire(double width) {
|
|
return width * localEngine->flat();
|
|
}
|
|
|
|
inline long RandFlat::fireInt(long n) {
|
|
return long(localEngine->flat()*double(n));
|
|
}
|
|
|
|
inline long RandFlat::fireInt(long a1, long n) {
|
|
return long(localEngine->flat()*double(n-a1)) + a1;
|
|
}
|
|
|
|
inline void RandFlat::fireBits() {
|
|
const double factor= 2.0*MSB; // this should fit into a double!
|
|
firstUnusedBit= MSB;
|
|
randomInt= (unsigned long)(factor*localEngine->flat());
|
|
}
|
|
|
|
inline int RandFlat::fireBit() {
|
|
if (firstUnusedBit==0)
|
|
fireBits();
|
|
unsigned long temp= firstUnusedBit&randomInt;
|
|
firstUnusedBit>>= 1;
|
|
return temp!=0;
|
|
}
|
|
|
|
} // namespace CLHEP
|