random_demo/
random_demo.rs1use rustframe::random::{crypto_rng, rng, Rng, SliceRandom};
2
3fn 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