26 lines
617 B
Rust
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
|
|
|
|
}
|
|
} |