use rand::SeedableRng;
use rand_chacha::ChaCha8Rng;
use std::hash::{Hash, Hasher};
pub fn seed_random(seed: &str) -> ChaCha8Rng {
let mut hasher = std::collections::hash_map::DefaultHasher::new();
seed.hash(&mut hasher);
let hash = hasher.finish();
let mut seed_bytes = [0u8; 32];
seed_bytes[..8].copy_from_slice(&hash.to_le_bytes());
ChaCha8Rng::from_seed(seed_bytes)
}
#[cfg(test)]
mod tests {
use rand::Rng;
use super::*;
#[test]
fn test_seed_random_is_deterministic() {
let mut rng1 = seed_random("test-seed");
let mut rng2 = seed_random("test-seed");
for _ in 0..100 {
assert_eq!(rng1.random::<u32>(), rng2.random::<u32>());
}
}
#[test]
fn test_different_seeds_produce_different_results() {
let mut rng1 = seed_random("test-seed-1");
let mut rng2 = seed_random("test-seed-2");
assert_ne!(rng1.random::<u32>(), rng2.random::<u32>());
}
}