00001 #include "ECF_base.h" 00002 #include "SimpleRandomizer.h" 00003 #include <time.h> 00004 00005 00006 SimpleRandomizer::SimpleRandomizer(unsigned int seed) 00007 { 00008 if(seed == 0) 00009 srand((uint) time(NULL)); 00010 else 00011 srand(seed); 00012 } 00013 00014 00015 int SimpleRandomizer::getRandomInteger(int p, int q) 00016 { 00017 return p + (int)( (double)(q-p+1) * (rand() / (RAND_MAX + 1.0))); 00018 } 00019 00020 00021 int SimpleRandomizer::getRandomInteger(int size) 00022 { 00023 return (int)( (double)(size) * (rand() / (RAND_MAX + 1.0))); 00024 } 00025 00026 00027 double SimpleRandomizer::getRandomDouble() 00028 { 00029 return rand() / (double(RAND_MAX)); 00030 } 00031 00032 00033 void SimpleRandomizer::registerParameters(StateP s) 00034 { 00035 s->getRegistry()->registerEntry("randomizer.seed", (voidP) new uint(0), ECF::UINT, 00036 "randomizer seed, 0 uses time(NULL) (default: 0)"); 00037 } 00038 00039 00040 bool SimpleRandomizer::initialize(StateP state) 00041 { 00042 uint seed = 0; 00043 if(state->getRegistry()->isModified("randomizer.seed")) { 00044 voidP sptr = state->getRegistry()->getEntry("randomizer.seed"); 00045 seed = *((int*)sptr.get()); 00046 } 00047 00048 if(seed != 0) 00049 srand(seed); 00050 else 00051 #ifdef _MPI 00052 srand((uint) time(NULL) + state->getCommunicator()->getCommRank()); 00053 #else 00054 srand((uint) time(NULL)); 00055 #endif 00056 return true; 00057 }