Skip to content

Random generator

Rust

mod rand_generator {
    use rand::{Rng, seq::SliceRandom};
    use rand_chacha::{ChaCha20Rng, rand_core::SeedableRng};
    use rand_distr::{
        Distribution, Normal,
        uniform::{SampleRange, SampleUniform},
    };

    pub struct RandomGenerator {
        rng: ChaCha20Rng,
    }

    impl RandomGenerator {
        pub fn new() -> Self {
            Self {
                rng: ChaCha20Rng::from_os_rng(),
            }
        }

        pub fn from_seed(seed: u64) -> Self {
            Self {
                rng: ChaCha20Rng::seed_from_u64(seed),
            }
        }

        pub fn random_normal(&mut self, mean: f64, std: f64) -> f64 {
            let normal_dist = Normal::<f64>::new(mean, std).unwrap();
            normal_dist.sample(&mut self.rng)
        }

        pub fn random_range<T: SampleUniform, U: SampleRange<T>>(&mut self, range: U) -> T {
            self.rng.random_range(range)
        }

        pub fn random_bool(&mut self, prob: f64) -> bool {
            self.rng.random_bool(prob.clamp(0.0, 1.0))
        }

        pub fn random_permutation(&mut self, n: usize) -> Vec<usize> {
            let mut permutation: Vec<usize> = (0..n).collect();
            permutation.shuffle(&mut self.rng);
            permutation
        }

        pub fn shuffle<T>(&mut self, v: &mut [T]) {
            v.shuffle(&mut self.rng);
        }
    }
}