Skip to main content

strontium_core/
rng.rs

1use rand_chacha::ChaCha20Rng;
2use rand_core::{RngCore, SeedableRng};
3
4pub struct Rng {
5    rng: ChaCha20Rng,
6    seed: u64,
7}
8
9impl Rng {
10    pub fn new(seed: u64) -> Self {
11        Self {
12            rng: ChaCha20Rng::seed_from_u64(seed),
13            seed,
14        }
15    }
16
17    pub fn next_u64(&mut self) -> u64 {
18        self.rng.next_u64()
19    }
20
21    pub fn seed(&self) -> u64 {
22        self.seed
23    }
24
25    pub fn shuffle<T>(&mut self, slice: &mut [T]) {
26        for i in (1..slice.len()).rev() {
27            let j = (self.rng.next_u64() as usize) % (i + 1);
28            slice.swap(i, j);
29        }
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::Rng;
36
37    #[test]
38    fn same_seed_produces_same_sequence() {
39        let mut left = Rng::new(42);
40        let mut right = Rng::new(42);
41
42        for _ in 0..8 {
43            assert_eq!(left.next_u64(), right.next_u64());
44        }
45    }
46}