Skip to main content

random_stats/
random_stats.rs

1use rustframe::random::{crypto_rng, rng, Rng};
2
3/// Demonstrates simple statistical checks on random number generators.
4fn main() {
5    chi_square_demo();
6    println!("\n-----\n");
7    monobit_demo();
8}
9
10fn chi_square_demo() {
11    println!("Chi-square test on PRNG");
12    let mut rng = rng();
13    let mut counts = [0usize; 10];
14    let samples = 10000;
15    for _ in 0..samples {
16        let v = rng.random_range(0..10usize);
17        counts[v] += 1;
18    }
19    let expected = samples as f64 / 10.0;
20    let chi2: f64 = counts
21        .iter()
22        .map(|&c| {
23            let diff = c as f64 - expected;
24            diff * diff / expected
25        })
26        .sum();
27    println!("counts: {:?}", counts);
28    println!("chi-square: {:.3}", chi2);
29}
30
31fn monobit_demo() {
32    println!("Monobit test on crypto RNG");
33    let mut rng = crypto_rng();
34    let mut ones = 0usize;
35    let samples = 1000;
36    for _ in 0..samples {
37        ones += rng.next_u64().count_ones() as usize;
38    }
39    let ratio = ones as f64 / (samples as f64 * 64.0);
40    println!("ones ratio: {:.4}", ratio);
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_chi_square_demo_runs() {
49        chi_square_demo();
50    }
51
52    #[test]
53    fn test_monobit_demo_runs() {
54        monobit_demo();
55    }
56}
57