00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "RandEngine.h"
00032 #include <stdlib.h>
00033
00034
00035 RandEngine::RandEngine(long seed) : mx(RAND_MAX)
00036 {
00037 setSeed(seed,0);
00038 setSeeds(&theSeed,0);
00039 seq = 0;
00040 }
00041
00042 RandEngine::~RandEngine() {}
00043
00044 RandEngine::RandEngine(const RandEngine &p) : mx(RAND_MAX)
00045 {
00046
00047
00048
00049 if ((this != &p) && (&p)) {
00050 theSeed = p.theSeed;
00051 seq = 0;
00052 for (HepInt i=0; i<p.seq; ++i) flat();
00053 setSeeds(&theSeed,0);
00054 }
00055 }
00056
00057 RandEngine & RandEngine::operator = (const RandEngine &p)
00058 {
00059
00060
00061
00062 if ((this != &p) && (&p)) {
00063 theSeed = p.theSeed;
00064 seq = 0;
00065 for (HepInt i=0; i<p.seq; ++i) flat();
00066 setSeeds(&theSeed,0);
00067 }
00068 return *this;
00069 }
00070
00071 void RandEngine::setSeed(long seed, HepInt)
00072 {
00073 theSeed = seed;
00074 srand( HepInt(seed) );
00075 seq = 0;
00076 }
00077
00078 void RandEngine::setSeeds(const long* seeds, HepInt)
00079 {
00080 setSeed(seeds ? *seeds : 19780503, 0);
00081 theSeeds = seeds;
00082 }
00083
00084 void RandEngine::saveStatus() const
00085 {
00086 ofstream outFile("Rand.conf", ios::out ) ;
00087
00088 if (!outFile.bad()) {
00089 outFile << theSeed << endl;
00090 outFile << seq << endl;
00091 }
00092 }
00093
00094 void RandEngine::restoreStatus()
00095 {
00096
00097
00098
00099
00100
00101 ifstream inFile("Rand.conf", ios::in);
00102 long count;
00103
00104 if (!inFile.bad() && !inFile.eof()) {
00105 inFile >> theSeed;
00106 inFile >> count;
00107 setSeed(theSeed,0);
00108 for (HepInt i=0; i<count; ++i) flat();
00109 }
00110 }
00111
00112 void RandEngine::showStatus() const
00113 {
00114 cout << endl;
00115 cout << "---------- Rand engine status ----------" << endl;
00116 cout << " Initial seed = " << theSeed << endl;
00117 cout << " Shooted sequences = " << seq << endl;
00118 cout << "----------------------------------------" << endl;
00119 }
00120
00121 HepDouble RandEngine::flat()
00122 {
00123 register HepDouble num = 0.;
00124
00125 while (num == 0.)
00126 num = rand()/(mx+1);
00127 seq++;
00128 return num;
00129 }
00130
00131 void RandEngine::flatArray(const HepInt size, HepDouble* vect)
00132 {
00133 register HepInt i;
00134
00135 for (i=0; i<size; ++i)
00136 vect[i]=flat();
00137 }
00138
00139 #ifndef ST_NO_TEMPLATE_DEF_ARGS
00140 void RandEngine::flatArray(vector<HepDouble>& vec)
00141 #else
00142 void RandEngine::flatArray(vector<HepDouble,allocator<HepDouble> >& vec)
00143 #endif
00144 {
00145 for (unsigned int i=0; i<vec.size(); ++i)
00146 vec[i]=flat();
00147 }