CLHEP/Random/TripleRand.h

// $Id: TripleRand.h,v 1.6 2000/04/17 23:00:46 mf Exp $
// -*- C++ -*-
//
// -----------------------------------------------------------------------
//                           Hep Random
//                       --- TripleRand ---
//                        class header file
// -----------------------------------------------------------------------
// A canopy pseudo-random number generator. Using the Tausworthe 
// exclusive-or shift register, a simple Integer Coungruence generator, and
// the Hurd 288 total bit shift register, all XOR'd with each other, we
// provide an engine that should be a fairly good "mother" generator.
//
// This is similar to DualRand, with the addition of the Hurd288Engine.
// From DualRand, we have the following:
//   Exclusive or of a feedback shift register and integer congruence
//   random number generator.  The feedback shift register uses offsets
//   127 and 97.  The integer congruence generator uses a different
//   multiplier for each stream.  The multipliers are chosen to give
//   full period and maximum "potency" for modulo 2^32.  The period of
//   the combined random number generator is 2^159 - 2^32, and the
//   sequences are different for each stream (not just started in a
//   different place).
// The above is then amended to also add in the exclusive or of the 
// 288-total bit Hurd engine which in this case is a series of 32 
// interconnected 9-bit shift registers, with the newest bit of each register
// formed by the XOR of the previous bit and some bit b-d from a previous
// register where d is chosen to create a primitive polynomial to maximize
// the period.
// =======================================================================
// Ken Smith      - Initial draft started: 23rd Jul 1998
//                - Added conversion operators:  6th Aug 1998
// M Fischler	  - Big merge with CLHEP 13 May 1999
//		  - Elimination of unused Taus() and Cong() accessors
// =======================================================================

#ifndef TripleRand_h
#define TripleRand_h

#include "CLHEP/Random/RandomEngine.h"
#include "CLHEP/Random/Hurd288Engine.h"

class TripleRand: public HepRandomEngine {

public:

  TripleRand();
  TripleRand( long seed );
  TripleRand( HepStd::istream & is );
  TripleRand( HepInt rowIndex, HepInt colIndex );
  virtual ~TripleRand();
  // Constructors and destructor

  TripleRand( const TripleRand & p );
  TripleRand & operator=( const TripleRand & p );
  // Copy constructor and operator=

  HepDouble flat();
  // Returns a pseudo random number between 0 and 1 
  // (excluding the end points)

  void flatArray( const HepInt size, HepDouble * vect );
  // Fills an array "vect" of specified size with flat random values.

  void setSeed( long seed, HepInt );
  // Sets the state of the algorithm according to seed.

  void setSeeds( const long * seeds, HepInt );
  // Sets the state of the algorithm according to the zero-terminated 
  // array of seeds.

  void saveStatus( const char filename[] = "TripleRand.conf" ) const;
  // Saves on named file the current engine status.

  void restoreStatus( const char filename[] = "TripleRand.conf" );
  // Reads from named file the last saved engine status and restores it.

  void showStatus() const;
  // Dumps the current engine status on the screen.

  operator HepFloat();      // flat value, without worrying about filling bits
  operator unsigned int();  // 32-bit flat value, quickest of all

  friend HepStd::ostream & operator<<( HepStd::ostream & os, const TripleRand & e );
  friend HepStd::istream & operator>>( HepStd::istream & is,       TripleRand & e );

private:

  static HepInt numEngines;

class Tausworthe {
public:

  Tausworthe();
  Tausworthe(unsigned int seed);
  
  operator unsigned int();

  void put( HepStd::ostream & os ) const;
  void get( HepStd::istream & is );

private:
 
  HepInt wordIndex;
  unsigned int words[4];
}; // Tausworthe

class IntegerCong {
public:

  IntegerCong();
  IntegerCong(unsigned int seed, HepInt streamNumber);
  
  operator unsigned int();

  void put( HepStd::ostream & os ) const;
  void get( HepStd::istream & is );
 
private:
  
  unsigned int state, multiplier, addend;
}; // IntegerCong

  static HepDouble twoToMinus_32;
  static HepDouble twoToMinus_53;
  static HepDouble nearlyTwoToMinus_54;
  void powersOfTwo();

  Hurd288Engine & Hurd();  // retrieve the constituent engine for input

  const Tausworthe    & ConstTaus() const;  // Same as above
  const IntegerCong   & ConstCong() const;  // necessary for 
  const Hurd288Engine & ConstHurd() const;  // output

  Tausworthe    tausworthe;  // Instances of each of the 
  IntegerCong   integerCong; // three engines that combine to make
  Hurd288Engine hurd;        // one TripleRand instance 

}; // TripleRand

#endif // TripleRand_h

Generated by GNU enscript 1.6.1.