AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
rng.h
1#ifndef UTILS_RNG_H
2#define UTILS_RNG_H
3
4#include <algorithm>
5#include <cassert>
6#include <random>
7#include <vector>
8
9namespace utils {
10class RandomNumberGenerator {
11 // Mersenne Twister random number generator.
12 std::mt19937 rng;
13
14public:
15 RandomNumberGenerator(); // Seed with a value depending on time and process
16 // ID.
17 explicit RandomNumberGenerator(int seed);
18 RandomNumberGenerator(const RandomNumberGenerator&) = delete;
19 RandomNumberGenerator& operator=(const RandomNumberGenerator&) = delete;
20 ~RandomNumberGenerator();
21
22 void seed(int seed);
23
24 // Return random double in [0..1).
25 double random()
26 {
27 std::uniform_real_distribution<double> distribution(0.0, 1.0);
28 return distribution(rng);
29 }
30
31 // Return random integer in [0..bound).
32 int random(int bound)
33 {
34 assert(bound > 0);
35 std::uniform_int_distribution<int> distribution(0, bound - 1);
36 return distribution(rng);
37 }
38
39 template <typename T>
40 typename T::const_iterator choose(const T& vec)
41 {
42 return vec.begin() + random(vec.size());
43 }
44
45 template <typename T>
46 typename T::iterator choose(T& vec)
47 {
48 return vec.begin() + random(vec.size());
49 }
50
51 template<typename T>
52 void shuffle(std::vector<T>& vec)
53 {
54 std::shuffle(vec.begin(), vec.end(), rng);
55 }
56};
57} // namespace utils
58
59#endif