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  */
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  */
126  public:
127 
128  /** @brief Construct Marsaglia Engine
129  *
130  * Initialize x,y and z using the default random engine.
131  */
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  */
186 
187  };
188 
189 
190 };