use rand_mt::Mt64;
pub struct RandomGenerator {
rng: Mt64,
}
impl RandomGenerator {
pub fn with_seed(seed: u64) -> Self {
Self {
rng: Mt64::new(seed),
}
}
pub fn new() -> Self {
let seed = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs();
Self::with_seed(seed)
}
pub fn random(&mut self) -> f64 {
use rand::Rng;
self.rng.random()
}
pub fn random_range(&mut self, n: u64) -> u64 {
use rand::Rng;
self.rng.random_range(0..n)
}
}
impl Default for RandomGenerator {
fn default() -> Self {
Self::new()
}
}
pub type MersenneTwister = RandomGenerator;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_random_with_seed() {
let mut rng1 = RandomGenerator::with_seed(12345);
let mut rng2 = RandomGenerator::with_seed(12345);
for _ in 0..10 {
assert_eq!(rng1.random(), rng2.random());
}
}
#[test]
fn test_random_range() {
let mut rng = RandomGenerator::with_seed(12345);
for _ in 0..100 {
let r = rng.random_range(10);
assert!(r < 10);
}
}
#[test]
fn test_random_in_range() {
let mut rng = RandomGenerator::with_seed(12345);
for _ in 0..100 {
let r = rng.random();
assert!(r >= 0.0 && r < 1.0);
}
}
#[test]
fn test_different_seeds() {
let mut rng1 = RandomGenerator::with_seed(12345);
let mut rng2 = RandomGenerator::with_seed(54321);
let mut different = false;
for _ in 0..10 {
if rng1.random() != rng2.random() {
different = true;
break;
}
}
assert!(different);
}
#[test]
fn test_default() {
let _rng = RandomGenerator::default();
}
}