1use rand::seq::SliceRandom;
4use rand::Rng;
5
6pub fn randrange(lo: i32, hi: i32) -> i32 {
19 rand::thread_rng().gen_range(lo..hi)
20}
21
22pub fn randint(lo: i32, hi: i32) -> i32 {
34 rand::thread_rng().gen_range(lo..=hi)
35}
36
37pub fn shuffle<T>(v: &mut [T]) {
50 let mut rng = rand::thread_rng();
51
52 v.shuffle(&mut rng);
53}
54
55pub fn random() -> f64 {
66 let mut rng = rand::thread_rng();
67
68 rng.gen::<f64>()
69}
70
71pub fn choice<T>(v: &[T]) -> Option<&T> {
83 if v.is_empty() {
84 return None;
85 }
86 let idx = randrange(0, v.len() as i32) as usize;
88 Some(&v[idx])
89}
90
91#[cfg(test)]
94mod tests {
95 use super::*;
96
97 #[test]
98 fn randrange_test1() {
99 for _ in 0..10 {
100 let value = randrange(1, 2);
101 assert!(value == 1);
102 }
103 for _ in 0..10 {
105 let value = randrange(1, 3);
106 assert!(value == 1 || value == 2);
107 }
108 for _ in 0..1000 {
110 let value = randrange(1, 10);
111 assert!(value >= 1 && value < 10);
112 }
113 }
114
115 #[test]
116 fn randint_test1() {
117 for _ in 0..10 {
118 let value = randint(1, 1);
119 assert!(value == 1);
120 }
121 for _ in 0..10 {
123 let value = randint(1, 2);
124 assert!(value >= 1 && value <= 2);
125 }
126 for _ in 0..1000 {
128 let value = randint(1, 10);
129 assert!(value >= 1 && value <= 10);
130 }
131 }
132
133 #[test]
134 fn randrange_test2() {
135 let mut v = vec![];
136 for _ in 0..1000 {
137 let value = randrange(1, 10);
138 v.push(value);
139 }
140 v.sort();
141 v.dedup();
142 for i in 1..=9 {
143 assert!(v.contains(&i));
144 }
145 assert_eq!(v.contains(&0), false);
146 assert_eq!(v.contains(&10), false);
147 assert!(v[0] == 1);
149 assert!(v[v.len() - 1] == 9);
150 }
151
152 #[test]
153 fn randint_test2() {
154 let mut v = vec![];
155 for _ in 0..1000 {
156 let value = randint(1, 10);
157 v.push(value);
158 }
159 v.sort();
160 v.dedup();
161 for i in 1..=10 {
162 assert!(v.contains(&i));
163 }
164 assert_eq!(v.contains(&0), false);
165 assert_eq!(v.contains(&11), false);
166 assert!(v[0] == 1);
168 assert!(v[v.len() - 1] == 10);
169 }
170
171 #[test]
172 fn shuffle_test1() {
173 let mut v = vec![];
174 for i in 1..=100 {
175 v.push(i);
176 }
177 assert!(v.len() == 100);
178 let backup = v.clone();
179 shuffle(&mut v);
181 assert!(v.len() == backup.len());
182 assert!(v != backup);
183 v.sort();
184 assert!(v == backup);
185 }
186
187 #[test]
188 fn random_test1() {
189 for _ in 0..100 {
190 let number = random();
191 assert!(number >= 0.0 && number < 1.0)
192 }
193 }
194
195 #[test]
196 fn choice_test1() {
197 let v = vec![1, 2, 3];
198 for _ in 0..100 {
199 let &elem = choice(&v).unwrap();
200 assert!(v.contains(&elem));
201 }
202 }
203
204 #[test]
205 fn choice_test2() {
206 let empty = Vec::<i32>::new();
207 let elem = choice(&empty);
208 assert_eq!(elem, None);
209 }
210}