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