26 lines
617 B
Rust

pub struct PicoRng {
hi: u32,
lo: u32
}
impl PicoRng {
// https://www.lexaloffle.com/bbs/?tid=51113
pub fn srand(seed: u32) -> PicoRng {
let mut rng = if seed == 0 {
PicoRng { hi: 0x60009755, lo: 0xdeadbeef }
} else {
PicoRng { hi: seed ^ 0xbead29ba, lo: seed }
};
for _ in 0..0x20 {
rng.rnd(0x10000);
}
return rng
}
pub fn rnd(&mut self, n: u32) -> u32 {
self.hi = self.hi.rotate_left(0x10).wrapping_add(self.lo);
self.lo = self.lo.wrapping_add(self.hi);
return self.hi % n
}
}