Skip to main content

origin_sdk/
random.rs

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}