double generate_uniform( double min, double max ) { TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "+sola::component::random::generate_uniform"); SERIALIZE_CALL(std::recursive_mutex, __random_lock); double result; std::uniform_real_distribution<double> uniform_dist; if(!__random_initialized) { THROW_RANDOM_EXCEPTION(RANDOM_EXCEPTION_UNINITIALIZED); } if(min > max) { THROW_RANDOM_EXCEPTION_MESSAGE( RANDOM_EXCEPTION_INVALID_PARAMETER, "min > max" ); } result = ((max - min) * uniform_dist(__random_generator)) + min; TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "-sola::component::random::generate_uniform, result. " << result); return result; }
double generate_normalized( double mean, double sigma, double crop_min, double crop_max ) { TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "+sola::component::random::generate_normalized"); SERIALIZE_CALL(std::recursive_mutex, __random_lock); double result; std::normal_distribution<double> normal_dist(mean, sigma); if(!__random_initialized) { THROW_RANDOM_EXCEPTION(RANDOM_EXCEPTION_UNINITIALIZED); } if(sigma < 0.0) { THROW_RANDOM_EXCEPTION_MESSAGE( RANDOM_EXCEPTION_INVALID_PARAMETER, "spread < 0.0" ); } if(crop_min > crop_max) { THROW_RANDOM_EXCEPTION_MESSAGE( RANDOM_EXCEPTION_INVALID_PARAMETER, "crop_min > crop_max" ); } result = normal_dist(__random_generator); if(result < crop_min) { result = crop_min; } else if(result > crop_max) { result = crop_max; } TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "-sola::component::random::generate_normalized, result. " << result); return result; }
void initialize( uint32_t seed ) { TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "+sola::component::random::initialize"); SERIALIZE_CALL(std::recursive_mutex, __random_lock); std::srand((uint32_t) std::time(NULL)); if(seed == GENERATE_RANDOM_SEED) { __random_generator.seed(rand()); } else { __random_generator.seed(seed); } __random_initialized = true; TRACE_MESSAGE(TRACE_LEVEL_VERBOSE, "-sola::component::random::initialize"); }
void _nimble_trace::generate( __in nimble_lvl_t level, __in const std::string &header, __in const std::string &funct, __in const std::string &source, __in size_t line, __in const char *format, ... ) { std::time_t tm; std::string buf, tmstr; std::stringstream result; SERIALIZE_CALL(m_lock); if(nimble_trace::m_started) { tm = std::time(NULL); tmstr = std::asctime(std::localtime(&tm)); result << "[" << tmstr.substr(0, tmstr.size() - 1) << "] "; if(!header.empty()) { result << CHK_STR(header); } if(!funct.empty()) { result << CHK_STR(funct); } if(format) { va_list lst; va_start(lst, format); int len = vsnprintf(NULL, 0, format, lst); if(len < 0) { buf = NIMBLE_TRACE_EXCEPTION_STRING( NIMBLE_TRACE_EXCEPTION_MALFORMED); } else if(!len) { buf = NIMBLE_TRACE_EXCEPTION_STRING( NIMBLE_TRACE_EXCEPTION_EMPTY); } else { va_end(lst); va_start(lst, format); buf.resize(++len, '\0'); len = vsnprintf((char *) &buf[0], len, format, lst); if(len < 0) { buf = NIMBLE_TRACE_EXCEPTION_STRING( NIMBLE_TRACE_EXCEPTION_MALFORMED); } else if(!len) { buf = NIMBLE_TRACE_EXCEPTION_STRING( NIMBLE_TRACE_EXCEPTION_EMPTY); } } va_end(lst); if(!buf.empty()) { result << ": " << CHK_STR(buf); } } result << " ("; if(!source.empty()) { result << source << ":"; } result << line << ")"; switch(level) { case TRACE_ERROR: SET_TERM_ATTRIB(nimble_trace::m_stream, 1, COL_FORE_RED); nimble_trace::m_stream << CHK_STR(result.str()) << std::endl; CLEAR_TERM_ATTRIB(nimble_trace::m_stream); break; case TRACE_WARNING: SET_TERM_ATTRIB(nimble_trace::m_stream, 1, COL_FORE_YELLOW); nimble_trace::m_stream << CHK_STR(result.str()) << std::endl; CLEAR_TERM_ATTRIB(nimble_trace::m_stream); break; default: nimble_trace::m_stream << CHK_STR(result.str()) << std::endl; break; } } }