Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
DualRand.h
Go to the documentation of this file.
1// -*- C++ -*-
2//
3// -----------------------------------------------------------------------
4// Hep Random
5// --- DualRand ---
6// class header file
7// -----------------------------------------------------------------------
8//
9// Canopy random number generator DualRand
10// Re-written as C++ routine for 32-bit ints MF 1/26/98
11//
12// Exclusive or of a feedback shift register and integer congruence
13// random number generator. The feedback shift register uses offsets
14// 127 and 97. The integer congruence generator uses a different
15// multiplier for each stream. The multipliers are chosen to give
16// full period and maximum "potency" for modulo 2^32. The period of
17// the combined random number generator is 2^159 - 2^32, and the
18// sequences are different for each stream (not just started in a
19// different place).
20//
21// =======================================================================
22// Canopy random number generator DualRand.
23// Doug Toussaint 5/25/88
24// Optimized by GMH 7/26/88
25// Optimized by GMH 7/26/88
26// Repaired by GMH 12/1/88 to update modular congruence state
27// Put into ranlib by GMH 6/23/89
28// Re-written as C++ routine for 32-bit ints MF 1/26/98
29// Re-written for CLHEP package KLS 6/04/98
30// Removed pow() from flat method for speed KLS 7/21/98
31// Ken Smith - Added conversion operators: 6th Aug 1998
32// Mark Fischler methods for distrib. instance save/restore 12/8/04
33// Mark Fischler methods for anonymous save/restore 12/27/04
34// Mark Fischler - methods for vector save/restore 3/7/05
35// =======================================================================
36
37
38#ifndef DualRand_h
39#define DualRand_h
40
42
43namespace CLHEP {
44
45/**
46 * @author
47 * @ingroup random
48 */
50
51public:
52
53 DualRand();
54 DualRand(long seed);
55 DualRand(std::istream & is);
56 DualRand(int rowIndex, int colIndex);
57 virtual ~DualRand();
58
59 // let the compiler generate the copy constructors
60 //DualRand(const DualRand & p);
61 //DualRand & operator=(const DualRand & p);
62
63 double flat();
64 // Returns a pseudo random number between 0 and 1
65 // (excluding the end points)
66
67 void flatArray(const int size, double * vect);
68 // Fills an array "vect" of specified size with flat random values.
69
70 void setSeed(long seed, int);
71 // Sets the state of the algorithm according to seed.
72
73 void setSeeds(const long * seeds, int);
74 // Sets the state of the algorithm according to the zero-terminated
75 // array of seeds.
76
77 void saveStatus( const char filename[] = "DualRand.conf") const;
78 // Saves on named file the current engine status.
79
80 void restoreStatus( const char filename[] = "DualRand.conf" );
81 // Reads from named file the last saved engine status and restores it.
82
83 void showStatus() const;
84 // Dumps the current engine status on the screen.
85
86 operator double(); // Returns same as flat()
87 operator float(); // flat value, without worrying about filling bits
88 operator unsigned int(); // 32-bit flat value, quickest of all
89
90 virtual std::ostream & put (std::ostream & os) const;
91 virtual std::istream & get (std::istream & is);
92 static std::string beginTag ( );
93 virtual std::istream & getState ( std::istream & is );
94
95 std::string name() const;
96 static std::string engineName() {return "DualRand";}
97
98 std::vector<unsigned long> put () const;
99 bool get (const std::vector<unsigned long> & v);
100 bool getState (const std::vector<unsigned long> & v);
101
102 static const unsigned int VECTOR_STATE_SIZE = 9;
103
104private:
105
106 // This generator is composed of two others combined:
107
108 class Tausworthe {
109 public:
110 Tausworthe();
111 Tausworthe(unsigned int seed);
112 operator unsigned int();
113 void put(std::ostream & os) const;
114 void put(std::vector<unsigned long> & v) const;
115 void get(std::istream & is);
116 bool get(std::vector<unsigned long>::const_iterator & iv);
117 private:
118 int wordIndex;
119 unsigned int words[4];
120 }; // Tausworthe
121
122 class IntegerCong {
123 public:
124 IntegerCong();
125 IntegerCong(unsigned int seed, int streamNumber);
126 operator unsigned int();
127 void put(std::ostream & os) const;
128 void put(std::vector<unsigned long> & v) const;
129 void get(std::istream & is);
130 bool get(std::vector<unsigned long>::const_iterator & iv);
131 private:
132 unsigned int state, multiplier, addend;
133 }; // IntegerCong
134
135 int numEngines;
136 Tausworthe tausworthe;
137 IntegerCong integerCong;
138
139}; // DualRand
140
141} // namespace CLHEP
142
143#endif // DualRand_h
std::string name() const
Definition DualRand.cc:72
void setSeeds(const long *seeds, int)
Definition DualRand.cc:137
void showStatus() const
Definition DualRand.cc:184
std::vector< unsigned long > put() const
Definition DualRand.cc:223
static const unsigned int VECTOR_STATE_SIZE
Definition DualRand.h:102
void restoreStatus(const char filename[]="DualRand.conf")
Definition DualRand.cc:153
virtual ~DualRand()
Definition DualRand.cc:114
void setSeed(long seed, int)
Definition DualRand.cc:131
void saveStatus(const char filename[]="DualRand.conf") const
Definition DualRand.cc:142
void flatArray(const int size, double *vect)
Definition DualRand.cc:125
virtual std::istream & get(std::istream &is)
Definition DualRand.cc:231
static std::string engineName()
Definition DualRand.h:96
double flat()
Definition DualRand.cc:116
virtual std::istream & getState(std::istream &is)
Definition DualRand.cc:252
static std::string beginTag()
Definition DualRand.cc:248