use rand::rngs::SmallRng;
use rand::SeedableRng;
pub trait Rng {
fn gen_u64(&mut self) -> u64;
fn gen_u128(&mut self) -> u128;
}
pub struct SeededRng {
inner: SmallRng,
seed: u64,
}
impl SeededRng {
pub fn new(seed: u64) -> Self {
Self {
inner: SmallRng::seed_from_u64(seed),
seed,
}
}
pub fn seed(&self) -> u64 {
self.seed
}
}
impl Rng for SeededRng {
fn gen_u64(&mut self) -> u64 {
rand::RngCore::next_u64(&mut self.inner)
}
fn gen_u128(&mut self) -> u128 {
let hi = self.gen_u64() as u128;
let lo = self.gen_u64() as u128;
(hi << 64) | lo
}
}