use prelude::*;
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize-serde", derive(Deserialize, Serialize))]
pub struct Rng (f64);
impl Rng {
pub fn new<T>(seed: T) -> Rng where T: FromPrimitive + ToPrimitive + Copy {
Rng(seed.to_f64().unwrap())
}
pub fn get<T>(self: &mut Self) -> T where T: FromPrimitive + ToPrimitive + Copy {
let large = self.0.sin() * 100000000.0;
self.0 += 1.0;
T::from_f64(large - large.floor()).unwrap()
}
pub fn range<T>(self: &mut Self, min: T, max: T) -> T where T: FromPrimitive + ToPrimitive + Copy {
let large = self.0.sin() * 100000000.0;
self.0 += 1.0;
let base = (large - large.floor()) as f64;
let min = min.to_f64().unwrap();
let max = max.to_f64().unwrap();
T::from_f64(min + base * (max - min)).unwrap()
}
pub fn chose<'a, T>(self: &mut Self, source: &'a [ T ]) -> &'a T {
let index = self.range(0, source.len());
&source[index]
}
}