CLHEP VERSION Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

Matrix/CLHEP/Random/Hurd288Engine.h
Go to the documentation of this file.
1 // $Id: Hurd288Engine.h,v 1.5 2010/06/16 17:24:53 garren Exp $
2 // -*- C++ -*-
3 //
4 // -----------------------------------------------------------------------
5 // HEP Random
6 // --- Hurd288Engine ---
7 // class header file
8 // -----------------------------------------------------------------------
9 // The starting point for the Hurd Random algorithm is the paper in
10 // IEEE Transactions on Computers c23, 2 Feb 1974. The algorithm is
11 // essentially a series of 32 interconnected b-bit registers. The basic
12 // property is that at each step, bit 1 becomes bit 0, bit 2 the new bit 1,
13 // bit b the new bit b-1. This is modified so that the new bit b0 is the old
14 // bit b1 XOR'd with some bit b-d from the previous bit register. The values
15 // of d can be chosen so as to generate a primitive polynomial, a maximal
16 // length sequence through all bit patterns except the zero pattern.
17 //
18 // This generator, Hurd288, use values based upon Table I of the afore-
19 // mentioned paper, such that we have 288 total bits, representing 32
20 // 9-bit registers (actually implemented as an array of 9 32-bit words)
21 // =======================================================================
22 // 07-23-98 KLS Initial draft started
23 // Ken Smith - Added conversion operators: 6th Aug 1998
24 // Mark Fischler - methods for distrib. instacne save/restore 12/8/04
25 // Mark Fischler - methods for anonymous save/restore 12/27/04
26 // =======================================================================
27 
28 #ifndef Hurd288Engine_h
29 #define Hurd288Engine_h
30 
31 #include "CLHEP/Random/defs.h"
32 #include "CLHEP/Random/RandomEngine.h"
33 
34 namespace CLHEP {
35 
41 
42 public:
43 
44  Hurd288Engine();
45  Hurd288Engine( std::istream &is );
46  Hurd288Engine( long seed );
47  Hurd288Engine( int rowIndex, int colIndex );
48  virtual ~Hurd288Engine();
49  // Constructors and destructor.
50 
51  double flat();
52  // Returns a pseudo random number between 0 and 1
53 
54  void flatArray( const int size, double* vect );
55  // Fills the array "vect" of specified size with flat random values.
56 
57  void setSeed( long seed, int );
58  // Sets the state of the algorithm according to seed.
59 
60  void setSeeds( const long* seeds, int );
61  // Sets the state of the algorithm according to the zero-terminated
62  // array of seeds.
63 
64  void saveStatus( const char filename[] = "Hurd288Engine.conf" ) const;
65  // Saves on named file the current engine status
66 
67  void restoreStatus( const char filename[] = "Hurd288Engine.conf" );
68  // Reads from named file the last saved engine status
69  // and restores it.
70 
71  void showStatus() const;
72  // Dumps the engine status on the screen
73 
74  operator float(); // flat value, without worrying about filling bits
75  operator unsigned int(); // 32-bit flat value, quickest of all
76 
77  virtual std::ostream & put (std::ostream & os) const;
78  virtual std::istream & get (std::istream & is);
79  static std::string beginTag ( );
80  virtual std::istream & getState ( std::istream & is );
81 
82  std::string name() const;
83  static std::string engineName() {return "Hurd288Engine";}
84 
85  std::vector<unsigned long> put () const;
86  bool get (const std::vector<unsigned long> & v);
87  bool getState (const std::vector<unsigned long> & v);
88 
89  static const unsigned int VECTOR_STATE_SIZE = 11;
90 
91 private:
92  static int numEngines;
93  static int maxIndex;
94 
95  void advance();
96 
97  int wordIndex;
98  unsigned int words[9];
99 
100 }; // Hurd288Engine
101 
102 } // namespace CLHEP
103 
104 #ifdef ENABLE_BACKWARDS_COMPATIBILITY
105 // backwards compatibility will be enabled ONLY in CLHEP 1.9
106 using namespace CLHEP;
107 #endif
108 
109 #endif // Hurd288Engine_h