#[derive(Clone, Debug)]
pub struct Rng(u64);
impl Rng {
pub fn new(seed: u64) -> Self {
Self(seed ^ 0x9e37_79b9_7f4a_7c15)
}
pub fn next(&mut self) -> u64 {
self.0 = self.0.wrapping_add(0x9e37_79b9_7f4a_7c15);
let mut z = self.0;
z = (z ^ (z >> 30)).wrapping_mul(0xbf58_476d_1ce4_e5b9);
z = (z ^ (z >> 27)).wrapping_mul(0x94d0_49bb_1331_11eb);
z ^ (z >> 31)
}
pub fn below(&mut self, n: u64) -> u64 {
if n == 0 {
return 0;
}
self.next() % n
}
pub fn chance(&mut self, per_mille: u32) -> bool {
self.below(1000) < u64::from(per_mille)
}
pub fn shuffle<T>(&mut self, v: &mut [T]) {
for i in (1..v.len()).rev() {
let j = self.below(i as u64 + 1) as usize;
v.swap(i, j);
}
}
pub fn fork(&mut self) -> Self {
Self::new(self.next())
}
}