00001 #ifndef Impala_Util_QuasiRandomSequenceIterator_h 00002 #define Impala_Util_QuasiRandomSequenceIterator_h 00003 00004 namespace Impala 00005 { 00006 namespace Util 00007 { 00008 00009 class QuasiRandomSequenceIterator 00010 { 00011 public: 00012 QuasiRandomSequenceIterator(int length, int seed) 00013 { 00014 int i; 00015 for(i=0 ; i<length ; ++i) 00016 mSequence.push_back(i); 00017 mCurrent = mSequence.begin(); 00018 mPickout = 11+(2*seed); 00019 } 00020 00022 int operator* () const 00023 { 00024 return *mCurrent; 00025 } 00026 00028 QuasiRandomSequenceIterator& operator++ () 00029 { 00030 mCurrent = mSequence.erase(mCurrent); 00031 if(mCurrent == mSequence.end()) 00032 mCurrent = mSequence.begin(); 00033 if(mSequence.size() > 0) 00034 for(int i=mPickout ; i>0 ; --i) 00035 { 00036 ++mCurrent; 00037 if(mCurrent == mSequence.end()) 00038 mCurrent = mSequence.begin(); 00039 } 00040 return *this; 00041 } 00042 00043 private: 00044 std::list<int> mSequence; 00045 int mPickout; 00046 std::list<int>::iterator mCurrent; 00047 }; 00048 00049 }//namespace Util 00050 }//namespace Impala 00051 00052 #endif