#[derive(Clone, Debug)]
pub struct Pcg32 {
state: u64,
inc: u64,
}
impl Pcg32 {
pub fn new(seed: u64) -> Self {
let mut r = Pcg32 {
state: 0,
inc: (seed << 1) | 1,
};
r.next_u32();
r.state = r.state.wrapping_add(0x853c_49e6_748f_ea9b ^ seed);
r.next_u32();
r
}
pub fn next_u32(&mut self) -> u32 {
let old = self.state;
self.state = old
.wrapping_mul(6_364_136_223_846_793_005)
.wrapping_add(self.inc);
let xorshifted = (((old >> 18) ^ old) >> 27) as u32;
let rot = (old >> 59) as u32;
xorshifted.rotate_right(rot)
}
pub fn f32(&mut self) -> f32 {
(self.next_u32() >> 8) as f32 / (1u32 << 24) as f32
}
pub fn below(&mut self, n: u32) -> u32 {
((self.next_u32() as u64 * n as u64) >> 32) as u32
}
}