1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
    Simple and stright-forward random generator (wrapper to rand crate) - Inpired by the Python's random module
*/

use rand::Rng;

/// Generates a random float in the range `[0.0, 1.0)`
pub fn random() -> f64 {
    rand::thread_rng().gen()
}

/// Generates a random integer in the range `[a, b]`
pub fn randint(a: i64, b: i64) -> i64 {
    rand::thread_rng().gen_range(a..=b)
}

/// Generates a random unsigned integer in the range `[a, b]`
pub fn randuint(a: usize, b: usize) -> usize {
    rand::thread_rng().gen_range(a..=b)
}

/// Generates a random float in the range `[a, b]`
pub fn uniform(a: f64, b: f64) -> f64 {
    rand::thread_rng().gen_range(a..=b)
}

/// Picks a random element from a sequence and returns a reference to it
pub fn choice<T>(seq: &[T]) -> &T {
    &seq[randuint(0, seq.len())]
}

/// Shuffles a sequence in-place
pub fn shuffle<T>(seq: &mut [T]) {
    for i in 0..seq.len() {
        let j = randuint(0, seq.len());
        seq.swap(i, j);
    }
}