CLHEP 2.0.4.7 Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
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 }