ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DualRand.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file DualRand.h
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 
43 namespace CLHEP {
44 
49 class DualRand: public HepRandomEngine {
50 
51 public:
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 
104 private:
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:
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 
138 
139 }; // DualRand
140 
141 } // namespace CLHEP
142 
143 #endif // DualRand_h