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 }
00037
00038
00039 bool SimpleRandomizer::initialize(StateP state)
00040 {
00041 uint seed = 0;
00042 if(state->getRegistry()->isModified("randomizer.seed")) {
00043 voidP sptr = state->getRegistry()->getEntry("randomizer.seed");
00044 seed = *((int*)sptr.get());
00045 }
00046
00047 if(seed != 0)
00048 srand(seed);
00049 else
00050 #ifdef _MPI
00051 srand((uint) time(NULL) + state->getCommunicator()->getCommRank());
00052 #else
00053 srand((uint) time(NULL));
00054 #endif
00055 return true;
00056 }