#include <cstdint>
#include <random>
extern "C" {
struct Mt19937Handle {
std::mt19937 rng;
explicit Mt19937Handle(uint32_t seed) : rng(seed) {}
};
Mt19937Handle* mt19937_new(uint32_t seed) {
return new Mt19937Handle(seed);
}
void mt19937_free(Mt19937Handle* handle) {
delete handle;
}
uint64_t binomial_sample(Mt19937Handle* handle, uint64_t trials, double p) {
if (trials <= UINT32_MAX) {
std::binomial_distribution<uint32_t> dist(
static_cast<uint32_t>(trials), p);
return static_cast<uint64_t>(dist(handle->rng));
} else {
std::binomial_distribution<uint64_t> dist(trials, p);
return dist(handle->rng);
}
}
}