CLHEP 2.0.4.7 Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

testRanecuSequence.cc

Go to the documentation of this file.
00001 // ----------------------------------------------------------------------
00002 //
00003 // testRanecuSequence 
00004 // look at report that certain seeds produce identical sequences
00005 // 
00006 // ----------------------------------------------------------------------
00007 #include <iostream> 
00008 #include <string>
00009 #include <vector>
00010 #include "CLHEP/Random/RanecuEngine.h"
00011 #include "CLHEP/Random/Random.h"
00012 
00013 struct Sample {
00014     int seed;
00015     std::vector<double> case1;
00016     std::vector<double> case2;
00017     std::vector<double> case3;
00018     std::vector<double> case4;
00019     std::vector<double> case5;
00020 };
00021 
00022 void useSeed( int, std::vector<Sample>& );
00023 
00024 bool compareSamples( Sample&, Sample&, std::ofstream& );
00025 
00026 int main() { 
00027 
00028     std::ofstream output("testRanecuSequence.output");  
00029 
00030     output << " Setting CLHEP Random Engine..." << std::endl;
00031     CLHEP::HepRandom::setTheEngine(new CLHEP::RanecuEngine);
00032     
00033     std::vector<Sample> ranList;
00034 
00035     // the first 4 seeds once resulted in identical sequences
00036     useSeed(1275177715, ranList);
00037     useSeed(1275171265, ranList);
00038     useSeed(1275168040, ranList);
00039     useSeed(1275168040-2048*215, ranList);
00040     useSeed(4132429, ranList);
00041     useSeed(-1357924, ranList);
00042     
00043     int sd = 53208134;
00044     for ( int i = 0; i < 1000; ++i ) {
00045         ++sd;
00046         useSeed(sd, ranList);
00047     }
00048     
00049     int numbad = 0;
00050     output << std::endl;
00051     for ( unsigned int it=0; it < ranList.size(); ++it ) {
00052         for ( unsigned int jt=it+1; jt < ranList.size(); ++jt ) {
00053             if( ! compareSamples(ranList[it], ranList[jt], output ) ) {
00054                 ++numbad;
00055                 output << "ERROR: Seed " << ranList[it].seed 
00056                        << " and Seed " << ranList[jt].seed 
00057                        << " are " << (ranList[jt].seed - ranList[it].seed )
00058                        << " apart and result in identical sequences" << std::endl;
00059                 std::cerr << "Seed " << ranList[it].seed 
00060                           << " and Seed " << ranList[jt].seed 
00061                           << " are " << (ranList[jt].seed - ranList[it].seed )
00062                           << " apart and result in identical sequences" << std::endl;
00063             }
00064         }
00065     }
00066 
00067     output << " numbad is " << numbad << std::endl;
00068     return numbad;
00069 } 
00070 
00071 void useSeed( int seed, std::vector<Sample>& ranList )
00072 {
00073     Sample v;
00074     v.seed = seed;
00075 // case 1  -- default constructor
00076     CLHEP::RanecuEngine c1;
00077     for( int i = 0; i < 15; ++i ) {
00078         v.case1.push_back( c1.flat() );
00079     }
00080 // case 2
00081     CLHEP::RanecuEngine c2(seed);
00082     for( int i = 0; i < 15; ++i ) {
00083         v.case2.push_back( c2.flat() );
00084     }
00085 // case 3 - use HepRandom
00086     CLHEP::HepRandom::setTheSeed(seed);
00087     for( int i = 0; i < 15; ++i ) {
00088         v.case3.push_back(  CLHEP::HepRandom::getTheEngine()->flat() );
00089     }
00090 // case 4
00091     CLHEP::RanecuEngine c4(1);
00092     c4.setSeed(seed);
00093     for( int i = 0; i < 15; ++i ) {
00094         v.case4.push_back( c4.flat() );
00095     }
00096 // case 5
00097     CLHEP::RanecuEngine c5(1);
00098     long seedarray[2];
00099     seedarray[0] = seed;
00100     seedarray[1] = 1;
00101     c5.setSeeds(seedarray,2);
00102     for( int i = 0; i < 15; ++i ) {
00103         v.case5.push_back( c5.flat() );
00104     }
00105 //
00106     ranList.push_back(v);
00107 
00108 }
00109 
00110 bool compareSamples( Sample& s1, Sample& s2, std::ofstream& output )
00111 {
00112     if ( s1.case1 == s2.case1 ) {
00113         output << " case1:  default constructor \n" ;
00114         output << " comparing Seed " << s1.seed << " and Seed " << s2.seed << std::endl;
00115         output << " case1 sequence:" ;
00116         for( unsigned int i=0; i < s1.case1.size(); ++i ) output << " " << s1.case1[i];
00117         output << std::endl;
00118         return false;
00119     }
00120     if ( s1.case2 == s2.case2 ) {
00121         output << " case2:  construct with single seed \n" ;
00122         output << " comparing Seed " << s1.seed << " and Seed " << s2.seed << std::endl;
00123         output << " case2 sequence:" ;
00124         for( unsigned int i=0; i < s1.case2.size(); ++i ) output << " " << s1.case2[i];
00125         output << std::endl;
00126         return false;
00127     }
00128     if ( s1.case3 == s2.case3 ) {
00129         output << " case3:  construct with single seed \n" ;
00130         output << " comparing Seed " << s1.seed << " and Seed " << s2.seed << std::endl;
00131         output << " case3 sequence:" ;
00132         for( unsigned int i=0; i < s1.case3.size(); ++i ) output << " " << s1.case3[i];
00133         output << std::endl;
00134         return false;
00135     }
00136     if ( s1.case4 == s2.case4 ) {
00137         output << " case4:  use setSeed \n" ;
00138         output << " comparing Seed " << s1.seed << " and Seed " << s2.seed << std::endl;
00139         output << " case4 sequence:" ;
00140         for( unsigned int i=0; i < s1.case4.size(); ++i ) output << " " << s1.case4[i];
00141         output << std::endl;
00142         return false;
00143     }
00144     if ( s1.case5 == s2.case5 ) {
00145         output << " case5:  use setSeeds \n" ;
00146         output << " comparing Seed " << s1.seed << " and Seed " << s2.seed << std::endl;
00147         output << " case5 sequence:" ;
00148         for( unsigned int i=0; i < s1.case5.size(); ++i ) output << " " << s1.case5[i];
00149         output << std::endl;
00150         return false;
00151     }
00152 
00153     return true;
00154 }

Generated on Thu Jul 1 22:02:31 2010 for CLHEP by  doxygen 1.4.7