use scirs2_core::random::{Rng, RngExt};
pub trait SpecRng: Send {
fn next_unit_f64(&mut self) -> f64;
}
impl<R> SpecRng for R
where
R: Rng + RngExt + Send,
{
fn next_unit_f64(&mut self) -> f64 {
RngExt::random::<f64>(self)
}
}
#[cfg(test)]
mod tests {
use super::*;
use scirs2_core::random::{SeedableRng, StdRng};
#[test]
fn std_rng_is_spec_rng() {
let mut rng = StdRng::seed_from_u64(123);
let u = rng.next_unit_f64();
assert!((0.0..1.0).contains(&u));
}
#[test]
fn seeded_rng_is_reproducible() {
let mut a = StdRng::seed_from_u64(99);
let mut b = StdRng::seed_from_u64(99);
assert_eq!(
(0..5).map(|_| a.next_unit_f64()).collect::<Vec<_>>(),
(0..5).map(|_| b.next_unit_f64()).collect::<Vec<_>>()
);
}
}