radiant_utils/misc/
rng.rs

1use prelude::*;
2
3/// A very simple, seedable random number generator based on sin().
4#[derive(Copy, Clone, Debug)]
5#[cfg_attr(feature = "serialize-serde", derive(Deserialize, Serialize))]
6pub struct Rng (f64);
7
8impl Rng {
9
10    /// Creates a new instance with given seed.
11    pub fn new<T>(seed: T) -> Rng where T: FromPrimitive + ToPrimitive + Copy {
12        Rng(seed.to_f64().unwrap())
13    }
14
15    /// Returns a random number between 0.0 and non-inclusive 1.0
16    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    /// Returns a random number between min and non-inclusive max.
25    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    /// Returns a random item from given slice.
37    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}