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
/// Provides random number generation using the [`getrandom`](../../getrandom/index.html) crate
///
/// # Examples
///
/// ```rust
/// use graph::rrand;
///
/// let random = rrand::get_random();
/// let random_ranged = rrand::get_random_ranged(0, 10);
/// ```
pub fn get_random() -> usize {
    let mut buffer = vec![0; std::mem::size_of::<usize>()];
    getrandom::getrandom(&mut buffer).unwrap();

    let mut result = 0;
    for (i, byte) in buffer.iter().copied().enumerate() {
        result |= (byte as usize) << (i * 8);
    }
    result
}

/// Gets a random number generator ([`SmallRng`](../../rand/rngs/struct.SmallRng.html))
/// using a random number from the [`getrandom`](../../getrandom/index.html) crate
/// as seed.
pub fn get_rng() -> rand::rngs::SmallRng {
    use rand::rngs::SmallRng;
    use rand::SeedableRng;

    SmallRng::seed_from_u64(get_random() as u64)
}