#[derive(Clone)]
pub struct Rng {
state: u64,
}
impl Rng {
pub fn new(seed: u64) -> Self {
Rng {
state: seed.wrapping_add(0x9E3779B97F4A7C15),
}
}
pub fn next_u64(&mut self) -> u64 {
self.state = self.state.wrapping_add(0x9E3779B97F4A7C15);
let mut z = self.state;
z = (z ^ (z >> 30)).wrapping_mul(0xBF58476D1CE4E5B9);
z = (z ^ (z >> 27)).wrapping_mul(0x94D049BB133111EB);
z ^ (z >> 31)
}
pub fn int(&mut self, lo: i64, hi: i64) -> i64 {
assert!(lo <= hi);
let span = (hi - lo) as u64 + 1;
lo + (self.next_u64() % span) as i64
}
pub fn usize(&mut self, lo: usize, hi: usize) -> usize {
self.int(lo as i64, hi as i64) as usize
}
pub fn shuffle<T>(&mut self, items: &mut [T]) {
for i in (1..items.len()).rev() {
let j = (self.next_u64() % (i as u64 + 1)) as usize;
items.swap(i, j);
}
}
}