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 }