Files
poulpy/spqlios/lib/test/testlib/random.cpp
Jean-Philippe Bossuat 06e4e58b2d spqlios basic wrapper
2025-01-26 12:26:44 +01:00

56 lines
1.3 KiB
C++

#include <cstdint>
#include <random>
#include "test_commons.h"
bool is_pow2(uint64_t n) { return !(n & (n - 1)); }
test_rng& randgen() {
static test_rng gen;
return gen;
}
uint64_t uniform_u64() {
static std::uniform_int_distribution<uint64_t> dist64(0, UINT64_MAX);
return dist64(randgen());
}
uint64_t uniform_u64_bits(uint64_t nbits) {
if (nbits >= 64) return uniform_u64();
return uniform_u64() >> (64 - nbits);
}
int64_t uniform_i64() {
std::uniform_int_distribution<int64_t> dist;
return dist(randgen());
}
int64_t uniform_i64_bits(uint64_t nbits) {
int64_t bound = int64_t(1) << nbits;
std::uniform_int_distribution<int64_t> dist(-bound, bound);
return dist(randgen());
}
int64_t uniform_i64_bounds(const int64_t lb, const int64_t ub) {
std::uniform_int_distribution<int64_t> dist(lb, ub);
return dist(randgen());
}
__int128_t uniform_i128_bounds(const __int128_t lb, const __int128_t ub) {
std::uniform_int_distribution<__int128_t> dist(lb, ub);
return dist(randgen());
}
double random_f64_gaussian(double stdev) {
std::normal_distribution<double> dist(0, stdev);
return dist(randgen());
}
double uniform_f64_bounds(const double lb, const double ub) {
std::uniform_real_distribution<double> dist(lb, ub);
return dist(randgen());
}
double uniform_f64_01() {
return uniform_f64_bounds(0, 1);
}