#pragma once
#include <cstdint>
#include <random>

class RNG {
public:
    explicit RNG(uint32_t seed = 0) : mt_(seed) {}

    void seed(uint32_t s) { mt_.seed(s); }

    uint32_t next_u32() { return mt_(); }

    uint32_t next_int(uint32_t bound) {
        std::uniform_int_distribution<uint32_t> dist(0, bound - 1);
        return dist(mt_);
    }

    double next_double() {
        std::uniform_real_distribution<double> dist(0.0, 1.0);
        return dist(mt_);
    }

private:
    std::mt19937 mt_;
};
