66 #define __STDC_LIMIT_MACROS
69 #include <visp3/core/vpUniRand.h>
73 : m_maxInvDbl(1.0 / static_cast<double>(UINT32_MAX)), m_maxInvFlt(1.0f / static_cast<float>(UINT32_MAX)), m_rng()
85 : m_maxInvDbl(1.0 / static_cast<double>(UINT32_MAX)), m_maxInvFlt(1.0f / static_cast<float>(UINT32_MAX)), m_rng()
108 uint32_t vpUniRand::boundedRand(uint32_t bound)
124 uint32_t threshold =
static_cast<uint64_t
>(-
static_cast<int64_t
>(bound) % bound);
135 if (r >= threshold) {
147 const unsigned long long val_ll = 6364136223846793005ULL;
148 const uint32_t val_31 = 31;
149 uint64_t oldstate = m_rng.state;
150 m_rng.state = (oldstate * val_ll) + m_rng.inc;
151 uint32_t xorshifted =
static_cast<uint32_t
>(((oldstate >> 18u) ^ oldstate) >> 27u);
152 uint32_t rot = oldstate >> 59u;
153 return (xorshifted >> rot) | (xorshifted << (static_cast<uint32_t>((-
static_cast<int64_t
>(rot)) & val_31)));
166 return boundedRand(b - a) + a;
207 m_rng.inc = (initseq << 1u) | 1u;
209 m_rng.state += initstate;
int uniform(int a, int b)
void setSeed(uint64_t initstate, uint64_t initseq)