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}