r_tool/core/
random_util.rs

1use rand::Rng;
2
3pub struct RandomUtil;
4
5impl RandomUtil {
6    /// 生成指定范围内的随机整数。
7    ///
8    /// # 参数
9    ///
10    /// * `min`: 整数范围的下限值(包括该值)。
11    /// * `max`: 整数范围的上限值(包括该值)。
12    ///
13    /// # 返回值
14    ///
15    /// 返回生成的随机整数。
16    pub fn random_int(min: i32, max: i32) -> i32 {
17        let mut rng = rand::thread_rng();
18        rng.gen_range(min..=max)
19    }
20
21    /// 生成指定范围内的随机浮点数。
22    ///
23    /// # 参数
24    ///
25    /// * `min`: 浮点数范围的下限值(包括该值)。
26    /// * `max`: 浮点数范围的上限值(包括该值)。
27    ///
28    /// # 返回值
29    ///
30    /// 返回生成的随机浮点数。
31    pub fn random_float(min: f64, max: f64) -> f64 {
32        let mut rng = rand::thread_rng();
33        rng.gen_range(min..=max)
34    }
35
36    /// 生成随机布尔值。
37    ///
38    /// # 返回值
39    ///
40    /// 返回生成的随机布尔值。
41    pub fn random_bool() -> bool {
42        let mut rng = rand::thread_rng();
43        rng.gen()
44    }
45
46    /// 生成随机小写字母。
47    ///
48    /// # 返回值
49    ///
50    /// 返回生成的随机小写字母。
51    pub fn random_char() -> char {
52        let mut rng = rand::thread_rng();
53        rng.gen_range(b'a'..=b'z') as char
54    }
55
56    /// 生成指定长度的随机字符串,包含小写字母、大写字母和数字。
57    ///
58    /// # 参数
59    ///
60    /// * `length`: 字符串的长度。
61    ///
62    /// # 返回值
63    ///
64    /// 返回生成的随机字符串。
65    pub fn random_string(length: usize) -> String {
66        let mut rng = rand::thread_rng();
67        let characters: Vec<char> = (0..length)
68            .map(|_| {
69                let category = rng.gen_range(0..3);
70                match category {
71                    0 => rng.gen_range(b'a'..=b'z') as char,
72                    1 => rng.gen_range(b'A'..=b'Z') as char,
73                    2 => rng.gen_range(b'0'..=b'9') as char,
74                    _ => unreachable!(),
75                }
76            })
77            .collect();
78
79        characters.into_iter().collect()
80    }
81}
82
83
84#[cfg(test)]
85mod tests {
86    use super::*;
87
88    #[test]
89    fn test_random_int() {
90        let random_int = RandomUtil::random_int(1, 100);
91        assert!(random_int >= 1 && random_int <= 100);
92    }
93
94    #[test]
95    fn test_random_float() {
96        let random_float = RandomUtil::random_float(1.0, 100.0);
97        assert!(random_float >= 1.0 && random_float <= 100.0);
98    }
99
100    #[test]
101    fn test_random_bool() {
102        let random_bool = RandomUtil::random_bool();
103        assert!(random_bool == true || random_bool == false);
104    }
105
106    #[test]
107    fn test_random_char() {
108        let random_char = RandomUtil::random_char();
109        assert!((b'a'..=b'z').contains(&(random_char as u8)));
110    }
111
112    #[test]
113    fn test_random_string() {
114        let random_string = RandomUtil::random_string(10);
115        assert_eq!(random_string.len(), 10);
116    }
117}