radiant_utils/misc/
rng.rs1use prelude::*;
2
3#[derive(Copy, Clone, Debug)]
5#[cfg_attr(feature = "serialize-serde", derive(Deserialize, Serialize))]
6pub struct Rng (f64);
7
8impl Rng {
9
10 pub fn new<T>(seed: T) -> Rng where T: FromPrimitive + ToPrimitive + Copy {
12 Rng(seed.to_f64().unwrap())
13 }
14
15 pub fn get<T>(self: &mut Self) -> T where T: FromPrimitive + ToPrimitive + Copy {
17
18 let large = self.0.sin() * 100000000.0;
19 self.0 += 1.0;
20
21 T::from_f64(large - large.floor()).unwrap()
22 }
23
24 pub fn range<T>(self: &mut Self, min: T, max: T) -> T where T: FromPrimitive + ToPrimitive + Copy {
26
27 let large = self.0.sin() * 100000000.0;
28 self.0 += 1.0;
29
30 let base = (large - large.floor()) as f64;
31 let min = min.to_f64().unwrap();
32 let max = max.to_f64().unwrap();
33 T::from_f64(min + base * (max - min)).unwrap()
34 }
35
36 pub fn chose<'a, T>(self: &mut Self, source: &'a [ T ]) -> &'a T {
38 let index = self.range(0, source.len());
39 &source[index]
40 }
41}