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