Markopy
Utilizing Markov Models for brute forcing attacks
random.h
Go to the documentation of this file.
1
2
/** @file random.h
3
* @brief Random engine implementations for Markov
4
* @authors Ata Hakçıl
5
*
6
* @copydoc Markov::Random::RandomEngine
7
* @copydoc Markov::Random::DefaultRandomEngine
8
* @copydoc Markov::Random::Marsaglia
9
*/
10
11
#
pragma
once
12
#
include
<
random
>
13
#
include
<
iostream
>
14
15
/**
16
@brief Objects related to RNG
17
*/
18
namespace
Markov
::
Random
{
19
20
/** @brief An abstract class for Random Engine
21
*
22
* This class is used for generating random numbers, which are used for random walking on the graph.
23
*
24
* Main reason behind allowing different random engines is that some use cases may favor performance,
25
* while some favor good random.
26
*
27
* Mersenne can be used for truer random, while Marsaglia can be used for deterministic but fast random.
28
*
29
*/
30
class
RandomEngine
{
31
public
:
32
virtual
inline
unsigned
long
random
() = 0;
33
};
34
35
36
37
/** @brief Implementation using Random.h default random engine
38
*
39
* This engine is also used by other engines for seeding.
40
*
41
*
42
* @b Example @b Use: Using Default Engine with RandomWalk
43
* @code{.cpp}
44
* Markov::Model<char> model;
45
* Model.import("model.mdl");
46
* char* res = new char[11];
47
* Markov::Random::DefaultRandomEngine randomEngine;
48
* for (int i = 0; i < 10; i++) {
49
* this->RandomWalk(&randomEngine, 5, 10, res);
50
* std::cout << res << "\n";
51
* }
52
* @endcode
53
*
54
* @b Example @b Use: Generating a random number with Marsaglia Engine
55
* @code{.cpp}
56
* Markov::Random::DefaultRandomEngine de;
57
* std::cout << de.random();
58
* @endcode
59
*
60
*/
61
class
DefaultRandomEngine
:
public
RandomEngine
{
62
public
:
63
/** @brief Generate Random Number
64
* @return random number in long range.
65
*/
66
inline
unsigned
long
random
(){
67
return
this
->
distribution
(
)
(
this
->
generator
(
)
);
68
}
69
protected
:
70
71
/** @brief Default random device for seeding
72
*
73
*/
74
inline
std::random_device&
rd
() {
75
static
std::random_device _rd;
76
return
_rd;
77
}
78
79
/** @brief Default random engine for seeding
80
*
81
*/
82
inline
std::default_random_engine&
generator
() {
83
static
std::default_random_engine _generator(
rd
(
)
());
84
return
_generator;
85
}
86
87
/** @brief Distribution schema for seeding.
88
*
89
*/
90
inline
std::uniform_int_distribution<
long
long
unsigned
>&
distribution
() {
91
static
std::uniform_int_distribution<
long
long
unsigned
> _distribution(0, 0xffffFFFF);
92
return
_distribution;
93
}
94
95
};
96
97
98
/** @brief Implementation of Marsaglia Random Engine
99
*
100
* This is an implementation of Marsaglia Random engine, which for most use cases is a better fit than other solutions.
101
* Very simple mathematical formula to generate pseudorandom integer, so its crazy fast.
102
*
103
* This implementation of the Marsaglia Engine is seeded by random.h default random engine.
104
* RandomEngine is only seeded once so its not a performance issue.
105
*
106
* @b Example @b Use: Using Marsaglia Engine with RandomWalk
107
* @code{.cpp}
108
* Markov::Model<char> model;
109
* Model.import("model.mdl");
110
* char* res = new char[11];
111
* Markov::Random::Marsaglia MarsagliaRandomEngine;
112
* for (int i = 0; i < 10; i++) {
113
* this->RandomWalk(&MarsagliaRandomEngine, 5, 10, res);
114
* std::cout << res << "\n";
115
* }
116
* @endcode
117
*
118
* @b Example @b Use: Generating a random number with Marsaglia Engine
119
* @code{.cpp}
120
* Markov::Random::Marsaglia me;
121
* std::cout << me.random();
122
* @endcode
123
*
124
*/
125
class
Marsaglia
:
public
DefaultRandomEngine
{
126
public
:
127
128
/** @brief Construct Marsaglia Engine
129
*
130
* Initialize x,y and z using the default random engine.
131
*/
132
Marsaglia
(){
133
this
->
x
=
this
->
distribution
(
)
(
this
->
generator
(
)
);
134
this
->
y
=
this
->
distribution
(
)
(
this
->
generator
(
)
);
135
this
->
z
=
this
->
distribution
(
)
(
this
->
generator
(
)
);
136
//std::cout << "x: " << x << ", y: " << y << ", z: " << z << "\n";
137
}
138
139
140
inline
unsigned
long
random
(){
141
unsigned
long
t;
142
x
^=
x
<< 16;
143
x
^=
x
>> 5;
144
x
^=
x
<< 1;
145
146
t =
x
;
147
x
=
y
;
148
y
=
z
;
149
z
= t ^
x
^
y
;
150
151
return
z
;
152
}
153
154
155
unsigned
long
x
;
156
unsigned
long
y
;
157
unsigned
long
z
;
158
};
159
160
161
/** @brief Implementation of Mersenne Twister Engine
162
*
163
* This is an implementation of Mersenne Twister Engine, which is slow but is a good implementation for high entropy pseudorandom.
164
*
165
*
166
* @b Example @b Use: Using Mersenne Engine with RandomWalk
167
* @code{.cpp}
168
* Markov::Model<char> model;
169
* Model.import("model.mdl");
170
* char* res = new char[11];
171
* Markov::Random::Mersenne MersenneTwisterEngine;
172
* for (int i = 0; i < 10; i++) {
173
* this->RandomWalk(&MersenneTwisterEngine, 5, 10, res);
174
* std::cout << res << "\n";
175
* }
176
* @endcode
177
*
178
* @b Example @b Use: Generating a random number with Marsaglia Engine
179
* @code{.cpp}
180
* Markov::Random::Mersenne me;
181
* std::cout << me.random();
182
* @endcode
183
*
184
*/
185
class
Mersenne
:
public
DefaultRandomEngine
{
186
187
};
188
189
190
};
Markopy
MarkovModel
src
random.h
Generated by
1.9.0