use rand::Rng;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EpidemicConfig {
pub forward_probability: f64,
}
impl Default for EpidemicConfig {
fn default() -> Self {
Self {
forward_probability: 0.7,
}
}
}
impl EpidemicConfig {
pub fn should_forward(&self) -> bool {
let mut rng = rand::rng();
rng.random::<f64>() < self.forward_probability
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn forward_probability_bounds_are_deterministic() {
let never = EpidemicConfig {
forward_probability: 0.0,
};
let always = EpidemicConfig {
forward_probability: 1.0,
};
for _ in 0..1000 {
assert!(!never.should_forward(), "0.0 disables forwarding");
assert!(always.should_forward(), "1.0 always forwards");
}
}
}