cs431_homework/test/
rand.rs

1//! Utilities for random value generator
2
3use rand::Rng;
4use rand::distr::Alphanumeric;
5use rand::rngs::ThreadRng;
6
7/// Types that has random generator
8pub trait RandGen {
9    /// Randomly generates a value.
10    fn rand_gen(rng: &mut ThreadRng) -> Self;
11}
12
13const KEY_MAX_LENGTH: usize = 4;
14
15impl RandGen for String {
16    fn rand_gen(rng: &mut ThreadRng) -> Self {
17        let length = (rng.random::<u64>() as usize) % KEY_MAX_LENGTH;
18        rng.sample_iter(&Alphanumeric)
19            .take(length)
20            .map(|x| x as char)
21            .collect()
22    }
23}
24
25impl RandGen for usize {
26    /// pick only 16 bits, MSB=0
27    fn rand_gen(rng: &mut ThreadRng) -> Self {
28        const MASK: usize = 0x4004004004007777usize;
29        (rng.random::<u64>() as usize) & MASK
30    }
31}
32
33impl RandGen for u32 {
34    /// pick only 16 bits
35    fn rand_gen(rng: &mut ThreadRng) -> Self {
36        const MASK: u32 = 0x66666666u32;
37        rng.random::<u32>() & MASK
38    }
39}
40
41impl RandGen for u8 {
42    fn rand_gen(rng: &mut ThreadRng) -> Self {
43        rng.random::<u8>()
44    }
45}
46
47impl RandGen for () {
48    fn rand_gen(_rng: &mut ThreadRng) -> Self {}
49}