-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathrandom.hpp
More file actions
67 lines (53 loc) · 1.82 KB
/
Copy pathrandom.hpp
File metadata and controls
67 lines (53 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#ifndef CHAISCRIPT_EXTRAS_RANDOM_HPP_
#define CHAISCRIPT_EXTRAS_RANDOM_HPP_
#include <memory>
#include <random>
#include <chaiscript/chaiscript.hpp>
namespace chaiscript {
namespace extras {
namespace random {
class MT19937_Engine {
public:
MT19937_Engine()
: m_engine(std::random_device{}())
{
}
explicit MT19937_Engine(unsigned int t_seed)
: m_engine(t_seed)
{
}
MT19937_Engine(const MT19937_Engine &) = default;
MT19937_Engine &operator=(const MT19937_Engine &) = default;
void seed(unsigned int t_seed) {
m_engine.seed(t_seed);
}
int random_int(int t_min, int t_max) {
std::uniform_int_distribution<int> dist(t_min, t_max);
return dist(m_engine);
}
double random_float(double t_min, double t_max) {
std::uniform_real_distribution<double> dist(t_min, t_max);
return dist(m_engine);
}
private:
std::mt19937 m_engine;
};
ModulePtr bootstrap(ModulePtr m = std::make_shared<Module>())
{
m->add(user_type<MT19937_Engine>(), "MT19937_Engine");
m->add(constructor<MT19937_Engine ()>(), "MT19937_Engine");
m->add(constructor<MT19937_Engine (unsigned int)>(), "MT19937_Engine");
m->add(constructor<MT19937_Engine (const MT19937_Engine &)>(), "MT19937_Engine");
m->add(fun(&MT19937_Engine::seed), "seed");
m->add(fun(&MT19937_Engine::random_int), "random_int");
m->add(fun(&MT19937_Engine::random_float), "random_float");
m->add(fun([](MT19937_Engine &t_lhs, const MT19937_Engine &t_rhs) -> MT19937_Engine & {
t_lhs = t_rhs;
return t_lhs;
}), "=");
return m;
}
}
}
}
#endif /* CHAISCRIPT_EXTRAS_RANDOM_HPP_ */