arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/test/testlib/random.cpp
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/test/testlib/random.cppRaw
 1#include <cstdint>
 2#include <random>
 3
 4#include "test_commons.h"
 5
 6bool is_pow2(uint64_t n) { return !(n & (n - 1)); }
 7
 8test_rng& randgen() {
 9  static test_rng gen;
10  return gen;
11}
12uint64_t uniform_u64() {
13  static std::uniform_int_distribution<uint64_t> dist64(0, UINT64_MAX);
14  return dist64(randgen());
15}
16
17uint64_t uniform_u64_bits(uint64_t nbits) {
18  if (nbits >= 64) return uniform_u64();
19  return uniform_u64() >> (64 - nbits);
20}
21
22int64_t uniform_i64() {
23  std::uniform_int_distribution<int64_t> dist;
24  return dist(randgen());
25}
26
27int64_t uniform_i64_bits(uint64_t nbits) {
28  int64_t bound = int64_t(1) << nbits;
29  std::uniform_int_distribution<int64_t> dist(-bound, bound);
30  return dist(randgen());
31}
32
33int64_t uniform_i64_bounds(const int64_t lb, const int64_t ub) {
34  std::uniform_int_distribution<int64_t> dist(lb, ub);
35  return dist(randgen());
36}
37
38__int128_t uniform_i128_bounds(const __int128_t lb, const __int128_t ub) {
39  std::uniform_int_distribution<__int128_t> dist(lb, ub);
40  return dist(randgen());
41}
42
43double random_f64_gaussian(double stdev) {
44  std::normal_distribution<double> dist(0, stdev);
45  return dist(randgen());
46}
47
48double uniform_f64_bounds(const double lb, const double ub) {
49  std::uniform_real_distribution<double> dist(lb, ub);
50  return dist(randgen());
51}
52
53double uniform_f64_01() { return uniform_f64_bounds(0, 1); }