void mutate() { assert(cfg); size_t action = 0; // default = modify if (cfg->mutateSize) { action = chooseAction(std::vector<T>{{cfg->modifyProba, cfg->addProba, cfg->eraseProba}}, getRandomEngine()); } std::uniform_real_distribution<T> d(0, 1); // TODO replace by generic rand std::uniform_int_distribution<int> dInt(0, values.size() - 1); switch (action) { case 0: // modify values[dInt(getRandomEngine())] = d(getRandomEngine()); break; case 1: // add values.push_back(d(getRandomEngine())); break; case 2: default: // erase values.erase(values.begin() + dInt(getRandomEngine())); break; } }
static VectorDNA random(Config* c) { assert(c); VectorDNA res(c); res.values.resize(c->initialSize); std::uniform_real_distribution<T> d(0, 1); // TODO replace by generic rand for (size_t i = 0; i < c->initialSize; ++i) res.values[i] = d(getRandomEngine()); return res; }
inline IntT getRandomInteger(IntT Min = 0, IntT Max = std::numeric_limits<IntT>::max()) { std::uniform_int_distribution<IntT> dist(Min, Max); return dist(getRandomEngine()); }
inline char getRandomChar() { std::uniform_int_distribution<> LettersDist(0, LettersSize-1); return Letters[LettersDist(getRandomEngine())]; }
RandomRealGenerator<RealType>::RandomRealGenerator( RealType min, RealType max) : m_Engine(getRandomEngine()), m_Dist(min, std::nextafter(max, std::numeric_limits<RealType>::max())) {}
RandomIntGenerator<IntType>::RandomIntGenerator( std::default_random_engine& randomEngine, IntType min, IntType max) : m_Engine(getRandomEngine()), m_Dist(min, max) {}
RandomIntGenerator<IntType>::RandomIntGenerator( IntType min, IntType max) : m_Engine(getRandomEngine()), m_Dist(min, max) {}
inline IntT getRandomInteger() { std::uniform_int_distribution<IntT> dist; return dist(getRandomEngine()); }
double Utils::getRandNumber(double min, double max) { std::mt19937 mt = getRandomEngine(); std::uniform_real_distribution<double> dist(min, max); return dist(mt); }
float Utils::getRandNumber(float min, float max) { std::mt19937 mt = getRandomEngine(); std::uniform_real_distribution<float> dist(min, max); return dist(mt); }