pub struct TinyRng {
state: u64,
}
const A: u64 = 6364136223846793005;
const C: u64 = 1442695040888963407;
impl TinyRng {
pub fn from_seed(seed: u64) -> Self {
Self { state: seed }
}
pub fn next_u32(&mut self) -> u32 {
let new = self.state.wrapping_mul(A).wrapping_add(C);
self.state = new;
(new >> 32) as u32
}
pub fn generate(&mut self, max: u32) -> u32 {
self.next_u32() % max
}
}
pub fn shuffle<T>(v: Vec<T>, rng: &mut TinyRng) -> Vec<T> {
let mut v = v;
let len = v.len() as u32;
for i in 0..len {
let j = rng.generate(len);
v.swap(i as usize, j as usize);
}
v
}