1extern crate rand;
2
3use rand::seq::SliceRandom;
4use rand::Rng;
5use rand::SeedableRng;
6
7pub fn random() -> f64 {
9 rand::random::<f64>()
10}
11
12pub fn randrange(min: f64, max: f64) -> f64 {
14 rand::thread_rng().gen_range(min..max)
15}
16
17pub fn randint(min: i64, max: i64) -> i64 {
19 rand::thread_rng().gen_range(min..max)
20}
21
22pub fn randbool() -> bool {
24 rand::thread_rng().gen()
25}
26
27pub fn shuffle<T>(obj: &mut Vec<T>) {
29 let mut rng = rand::thread_rng();
30 obj.shuffle(&mut rng);
31}
32
33pub fn choose<T>(obj: &Vec<T>) -> Option<&T> {
35 let mut rng = rand::thread_rng();
36 obj.choose(&mut rng)
37}
38
39pub fn with_seed(seed: u64) -> SeededRand {
41 SeededRand::new(seed)
42}
43
44pub struct SeededRand {
45 rng: rand::rngs::StdRng,
46}
47
48impl SeededRand {
50 pub fn new(seed: u64) -> Self {
51 SeededRand {
52 rng: rand::rngs::StdRng::seed_from_u64(seed),
53 }
54 }
55
56 pub fn random(&mut self) -> f64 {
58 self.rng.gen()
59 }
60
61 pub fn randrange(&mut self, min: f64, max: f64) -> f64 {
63 self.rng.gen_range(min..max)
64 }
65
66 pub fn randbool(&mut self) -> bool {
68 self.rng.gen()
69 }
70
71 pub fn randint(&mut self, min: i64, max: i64) -> i64 {
73 self.rng.gen_range(min..max)
74 }
75
76 pub fn shuffle<T>(&mut self, obj: &mut Vec<T>) {
78 obj.shuffle(&mut self.rng);
79 }
80
81 pub fn choose<'a, T>(&mut self, obj: &'a Vec<T>) -> Option<&'a T> {
83 obj.choose(&mut self.rng)
84 }
85}