bloomfilter_rs/
random_sequence.rs

1use rand::Rng;
2use std::ops::Range;
3// Get a random alement from a range.
4///
5/// # Arguments
6///
7/// * `range` - The range that should be sampled.
8///
9pub fn random_elem_from_range<T>(range: Range<T>) -> T
10where
11    T: std::cmp::PartialOrd + rand::distributions::uniform::SampleUniform + Copy,
12{
13    let first_element_in_range = range.start;
14    if !range.is_empty() {
15        rand::thread_rng().gen_range::<T, Range<T>>(range)
16    } else {
17        first_element_in_range
18    }
19}
20
21// Get a random alement from a range.
22///
23/// # Arguments
24///
25/// * `range` - The range that should be sampled.
26///
27pub fn random_sequence_from_range<T>(range: Range<T>, sequence_length: usize) -> Vec<T>
28where
29    T: std::cmp::PartialOrd + rand::distributions::uniform::SampleUniform + Copy,
30{
31    (0..sequence_length)
32        .map(|_| random_elem_from_range(range.clone()))
33        .collect()
34}
35
36#[cfg(test)]
37mod tests {
38    mod get_elem_from_range {
39        use super::super::random_elem_from_range;
40        #[test]
41        fn sample_int_range() {
42            random_elem_from_range(0..10);
43        }
44        #[test]
45        fn sample_float_range() {
46            random_elem_from_range(0.0..1.0);
47        }
48        #[test]
49        fn sample_empty_range() {
50            assert_eq!(random_elem_from_range(0..0), 0);
51        }
52    }
53    mod random_sequence_from_range {
54        use super::super::random_sequence_from_range;
55        #[test]
56        fn get_range_with_ten_elements() {
57            let sampled_range: Vec<i32> = random_sequence_from_range(0..0, 10);
58            assert_eq!(sampled_range.len(), 10);
59        }
60    }
61}