1use tracing::debug;
2
3const RAND_MAX: u32 = 32767;
4const MULTIPLIER: u32 = 214013;
5const INCREMENT: u32 = 2531011;
6
7pub struct Random {
8 seed: u32,
9}
10
11impl Random {
12 pub fn new(seed: u32) -> Self {
13 Self { seed }
14 }
15
16 pub fn next(&mut self) -> u32 {
17 self.seed = self.seed.wrapping_mul(MULTIPLIER).wrapping_add(INCREMENT);
18 (self.seed >> 16) & RAND_MAX
19 }
20
21 pub fn set_seed(&mut self, seed: u32) {
22 debug!("Setting new random seed: {}", seed);
23 self.seed = seed;
24 }
25}
26
27#[cfg(test)]
28mod tests {
29 use super::*;
30
31 #[test]
32 fn it_works() {
33 let mut rng = Random::new(1337);
34
35 let random_number = rng.next();
36 assert_eq!(random_number, 4404);
37
38 let random_number = rng.next();
39 assert_eq!(random_number, 25954);
40 }
41}