Skip to main content

random_demo/
random_demo.rs

1use rustframe::random::{crypto_rng, rng, Rng, SliceRandom};
2
3/// Demonstrates basic usage of the random number generators.
4///
5/// It showcases uniform ranges, booleans, normal distribution,
6/// shuffling and the cryptographically secure generator.
7fn main() {
8    basic_usage();
9    println!("\n-----\n");
10    normal_demo();
11    println!("\n-----\n");
12    shuffle_demo();
13}
14
15fn basic_usage() {
16    println!("Basic PRNG usage\n----------------");
17    let mut prng = rng();
18    println!("random u64   : {}", prng.next_u64());
19    println!("range [10,20): {}", prng.random_range(10..20));
20    println!("bool         : {}", prng.gen_bool());
21}
22
23fn normal_demo() {
24    println!("Normal distribution\n-------------------");
25    let mut prng = rng();
26    for _ in 0..3 {
27        let v = prng.normal(0.0, 1.0);
28        println!("sample: {:.3}", v);
29    }
30}
31
32fn shuffle_demo() {
33    println!("Slice shuffling\n----------------");
34    let mut prng = rng();
35    let mut data = [1, 2, 3, 4, 5];
36    data.shuffle(&mut prng);
37    println!("shuffled: {:?}", data);
38
39    let mut secure = crypto_rng();
40    let byte = secure.random_range(0..256usize);
41    println!("crypto byte: {}", byte);
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47    use rustframe::random::{CryptoRng, Prng};
48
49    #[test]
50    fn test_basic_usage_range_bounds() {
51        let mut rng = Prng::new(1);
52        for _ in 0..50 {
53            let v = rng.random_range(5..10);
54            assert!(v >= 5 && v < 10);
55        }
56    }
57
58    #[test]
59    fn test_crypto_byte_bounds() {
60        let mut rng = CryptoRng::new();
61        for _ in 0..50 {
62            let v = rng.random_range(0..256usize);
63            assert!(v < 256);
64        }
65    }
66}
67