6 #include <sys/syscall.h> 7 #include <sys/random.h> 17 thread_local
class Rng :
public std::mt19937 {
26 Rng() : std::mt19937() {
29 std::lock_guard guard(mymut);
33 std::array<unsigned long, std::mt19937::state_size> state;
34 sysrandom(state.begin(), state.size()*
sizeof(
unsigned long));
35 std::seed_seq seedseq(state.begin(), state.end());
36 this->std::mt19937::seed(seedseq);
49 std::array<unsigned long, std::mt19937::state_size> state;
50 for(
size_t i=0;i<state.size();i++){
51 state[i] = base->operator()();
53 std::seed_seq seedseq(state.begin(), state.end());
54 this->std::mt19937::seed(seedseq);
60 void seed(
unsigned long s) {
62 this->std::mt19937::seed(s);
68 char* buffer =
reinterpret_cast<char*
>(dst);
69 std::ifstream stream(
"/dev/urandom", std::ios_base::binary | std::ios_base::in);
70 stream.read(buffer, dstlen);
Rng()
Definition: Rng.h:26
void randomize()
Definition: Rng.h:45
void seed(unsigned long s)
Seed only if s is nonzero.
Definition: Rng.h:60
static std::mutex mymut
Definition: Rng.h:23
static size_t sysrandom(void *dst, size_t dstlen)
Definition: Rng.h:66
static Rng * base
Definition: Rng.h:24