Implement g_random->randomSkewedUInt32()
This generates an exponential distribution, implemented as being a "log-uniform" distribution.
This commit is contained in:
parent
52d5a721a6
commit
a462359af1
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
#include "flow/IRandom.h"
|
#include "flow/IRandom.h"
|
||||||
|
#include "flow/Error.h"
|
||||||
|
#include "flow/Trace.h"
|
||||||
|
|
||||||
#include <random>
|
#include <random>
|
||||||
|
|
||||||
|
@ -90,6 +92,14 @@ public:
|
||||||
|
|
||||||
uint32_t randomUInt32() { return gen64(); }
|
uint32_t randomUInt32() { return gen64(); }
|
||||||
|
|
||||||
|
uint32_t randomSkewedUInt32(uint32_t min, uint32_t maxPlusOne) {
|
||||||
|
std::uniform_real_distribution<double> distribution( std::log(min), std::log(maxPlusOne-1) );
|
||||||
|
double logpower = distribution(random);
|
||||||
|
uint32_t loguniform = static_cast<uint32_t>( std::pow( 10, logpower ) );
|
||||||
|
// doubles can be imprecise, so let's make sure we don't violate an edge case.
|
||||||
|
return std::max(std::min(loguniform, maxPlusOne-1), min);
|
||||||
|
}
|
||||||
|
|
||||||
UID randomUniqueID() {
|
UID randomUniqueID() {
|
||||||
uint64_t x,y;
|
uint64_t x,y;
|
||||||
x = gen64();
|
x = gen64();
|
||||||
|
|
|
@ -76,6 +76,7 @@ public:
|
||||||
virtual UID randomUniqueID() = 0;
|
virtual UID randomUniqueID() = 0;
|
||||||
virtual char randomAlphaNumeric() = 0;
|
virtual char randomAlphaNumeric() = 0;
|
||||||
virtual std::string randomAlphaNumeric( int length ) = 0;
|
virtual std::string randomAlphaNumeric( int length ) = 0;
|
||||||
|
virtual uint32_t randomSkewedUInt32(uint32_t min, uint32_t maxPlusOne) = 0;
|
||||||
virtual uint64_t peek() const = 0; // returns something that is probably different for different random states. Deterministic (and idempotent) for a deterministic generator.
|
virtual uint64_t peek() const = 0; // returns something that is probably different for different random states. Deterministic (and idempotent) for a deterministic generator.
|
||||||
|
|
||||||
// The following functions have fixed implementations for now:
|
// The following functions have fixed implementations for now:
|
||||||
|
|
Loading…
Reference in New Issue