use std::sync::atomic::{AtomicUsize, Ordering};
pub struct ARng (AtomicUsize);
impl ARng {
pub fn new(seed: usize) -> ARng {
ARng(AtomicUsize::new(seed))
}
pub fn get(self: &Self) -> f64 {
let pos = self.0.fetch_add(1, Ordering::SeqCst);
let large = (pos as f64).sin() * 100000000.0;
large - large.floor()
}
pub fn range(self: &Self, min: f64, max: f64) -> f64 {
let pos = self.0.fetch_add(1, Ordering::SeqCst);
let large = (pos as f64).sin() * 100000000.0;
let base = (large - large.floor()) as f64;
min + base * (max - min)
}
pub fn chose<'a, T>(self: &Self, source: &'a [ T ]) -> &'a T {
let index = self.range(0 as f64, source.len() as f64) as usize;
&source[index]
}
}