in rd-hashd/src/hasher.rs [910:954]
fn test_clamped_normal() {
let _ = ::env_logger::try_init();
let mut rng = SmallRng::from_entropy();
// 0 stdev should always give mean.
println!("Testing ClampedNormal (0, 0) [-1, 1] == 0");
let n = super::ClampedNormal::new(0.0, 0.0, -1.0, 1.0);
for _ in 0..1024 {
assert_eq!(n.sample(&mut rng), 0.0);
}
// Should behave like a normal distribution with strict bounds.
println!("Testing ClampedNormal (1, 0.333333) [0, 2]");
let mut ckms = CKMS::<f64>::new(CKMS_ERROR);
let n = super::ClampedNormal::new(1.0, 0.333333, 0.0, 2.0);
for _ in 0..4096 {
let v = n.sample(&mut rng);
assert!(v >= 0.0 && v <= 2.0);
ckms.insert(v);
}
let p16 = ckms.query(0.16).unwrap().1;
let p50 = ckms.query(0.5).unwrap().1;
let p84 = ckms.query(0.84).unwrap().1;
println!("p16={:.3} p50={:.3} p84={:.3}", p16, p50, p84);
assert!(p16 >= 0.6 && p16 <= 0.7);
assert!(p50 >= 0.9 && p50 <= 1.1);
assert!(p84 >= 1.3 && p84 <= 1.4);
// Should behave close to a uniform distribution.
println!("Testing ClampedNormal (0, 10.0) [-1, 1]");
let mut ckms = CKMS::<f64>::new(CKMS_ERROR);
let n = super::ClampedNormal::new(0.0, 10.0, -1.0, 1.0);
for _ in 0..4096 {
let v = n.sample(&mut rng);
assert!(v >= -1.0 && v <= 1.0);
ckms.insert(v);
}
let p25 = ckms.query(0.25).unwrap().1;
let p50 = ckms.query(0.5).unwrap().1;
let p75 = ckms.query(0.75).unwrap().1;
println!("p25={:.3} p50={:.3} p75={:.3}", p25, p50, p75);
assert!(p25 >= -0.6 && p25 <= -0.4);
assert!(p50 >= -0.1 && p50 <= 0.1);
assert!(p75 >= 0.4 && p75 <= 0.6);
}