Files
2025-03-24 16:45:22 +01:00

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