42unsigned long long int myDebugIndex(7);
43std::string myDebugId(
"");
46#ifdef DEBUG_RANDCALLS_PARALLEL
49std::map<std::thread::id, int> threadIndices;
50std::map<std::string, int> lastThreadIndex;
65 oc.
addDescription(
"random",
"Random Number",
TL(
"Initialises the random number generator with the current system time"));
69 oc.
addDescription(
"seed",
"Random Number",
TL(
"Initialises the random number generator with the given value"));
75 if (which ==
nullptr) {
79 which->
setSeed((
unsigned long)time(
nullptr));
94 if (which ==
nullptr) {
102 if (rng ==
nullptr) {
105 const double res = double((*rng)() / 4294967296.0);
107#ifdef DEBUG_RANDCALLS
108 if (rng->
count == myDebugIndex
109 && (myDebugId ==
"" || rng->
id == myDebugId)) {
110 std::cout <<
"DEBUG\n";
112 std::stringstream stream;
113#ifdef DEBUG_RANDCALLS_PARALLEL
114 auto threadID = std::this_thread::get_id();
115 if (threadIndices.count(threadID) == 0) {
116 const int tmp = threadIndices.size();
117 threadIndices[threadID] = tmp;
119 int threadIndex = threadIndices[threadID];
120 auto it = lastThreadIndex.find(rng->
id);
121 if ((it == lastThreadIndex.end() || it->second != threadIndex)
122 && (myDebugId ==
"" || rng->
id == myDebugId)) {
123 std::cout <<
"DEBUG rng " << rng->
id <<
" change thread old=" << (it == lastThreadIndex.end() ? -1 : it->second) <<
" new=" << threadIndex <<
" (" << std::this_thread::get_id() <<
")\n";
125 lastThreadIndex[rng->
id] = threadIndex;
126 stream <<
"rng " << rng->
id <<
" call=" << rng->
count <<
" thread=" << threadIndex <<
" val=" << res <<
"\n";
129 stream <<
"rng " << rng->
id <<
" call=" << rng->
count <<
" val=" << res <<
"\n";
130 std::cout << stream.str();
135 std::stringstream stream;
136 stream <<
"rng " << rng->
id <<
" call=" << rng->
count <<
" val=" << res <<
"\n";
137 std::cout << stream.str();
148 u =
rand(2.0, rng) - 1;
149 const double v =
rand(2.0, rng) - 1;
151 }
while (q == 0.0 || q >= 1.0);
152 const double logRounded = ceil(log(q) * 1e14) / 1e14;
153 return mean + variance * u * sqrt(-2 * logRounded / q);
158 return -log(
rand(rng)) / rate;
bool gDebugFlag1
global utility flags for debugging
A storage for options typed value containers)
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
void addSynonyme(const std::string &name1, const std::string &name2, bool isDeprecated=false)
Adds a synonyme for an options name (any order)
void doRegister(const std::string &name, Option *o)
Adds an option under the given name.
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
static SumoRNG myRandomNumberGenerator
the default random number generator to use
static double randExp(double rate, SumoRNG *rng=nullptr)
Access to a random number from an exponential distribution.
static void initRand(SumoRNG *which=nullptr, const bool random=false, const int seed=23423)
Initialises the random number generator with hardware randomness or seed.
static int getSeed(SumoRNG *which=nullptr)
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
static double randNorm(double mean, double variance, SumoRNG *rng=nullptr)
Access to a random number from a normal distribution.
static void insertRandOptions(OptionsCont &oc)
Initialises the given options container with random number options.
static void initRandGlobal(SumoRNG *which=nullptr)
Reads the given random number options and initialises the random number generator in accordance.
unsigned long long int count