1use rand::{rngs::StdRng, Rng, RngCore, SeedableRng};
2
3pub fn exponential_decay(x: f64, a: f64) -> f64 {
4 f64::exp(-a * x)
5}
6
7pub fn random_bool(probability: f64, seed: Option<u64>) -> bool {
8 let mut rng: Box<dyn RngCore> = match seed {
9 Some(seed_value) => Box::new(StdRng::seed_from_u64(seed_value)),
10 None => Box::new(rand::thread_rng()),
11 };
12 rng.gen_bool(probability)
13}
14
15pub fn compute_std(values: &[f64]) -> f64 {
16 if values.is_empty() {
17 return 0.0;
18 }
19 let mean = values.iter().copied().sum::<f64>() / (values.len() as f64);
20 let var = values
21 .iter()
22 .map(|v| {
23 let diff = v - mean;
24 diff * diff
25 })
26 .sum::<f64>()
27 / (values.len() as f64);
28 var.sqrt()
29}