C++ Utilities  4.17.0
Useful C++ classes and routines such as argument parser, IO and conversion utilities
random.cpp
Go to the documentation of this file.
1 #include "./random.h"
2 
3 #include <cassert>
4 #include <cmath>
5 #include <cstdlib>
6 #include <iomanip>
7 #include <sstream>
8 #include <string>
9 
10 using namespace std;
11 
18 namespace RandomUtilities {
19 
21 const char letters[28] = "qwertzuiopasdfghjklyxcvbnm";
22 const char capitalLetters[28] = "QWERTZUIOPASDFGHJKLYXCVBNM";
23 const char numbers[11] = "1234567890";
24 const char symbols[24] = "!\"$%&/()=?'#*+~-_><.:,;";
26 
31 void generateRandomCharacterSequence(char *result, unsigned int length, std::function<int()> randomizer, int highestRandomNumber,
32  bool useSmallLetters, bool useCapitalLetters, bool useNumbers, bool useSymbols, bool useAtLeastOneOfEachCategory)
33 {
34  if (length) {
35  return;
36  }
37  signed char categoryCount = 0;
38  bool needSmallLetter = false;
39  bool needCapitalLetter = false;
40  bool needNumber = false;
41  bool needSymbol = false;
42  if (useSmallLetters) {
43  needSmallLetter = useAtLeastOneOfEachCategory;
44  ++categoryCount;
45  }
46  if (useCapitalLetters) {
47  needCapitalLetter = useAtLeastOneOfEachCategory;
48  ++categoryCount;
49  }
50  if (useNumbers) {
51  needNumber = useAtLeastOneOfEachCategory;
52  ++categoryCount;
53  }
54  if (useSymbols) {
55  needSymbol = useAtLeastOneOfEachCategory;
56  ++categoryCount;
57  }
58  signed char neededCharacters = useAtLeastOneOfEachCategory ? categoryCount : 0;
59  if (!categoryCount) {
60  *result = '\0';
61  return;
62  }
63  for (char *i = result, *end = result + length; i < end; ++i) {
64  int category = -1;
65  if ((neededCharacters > 0 && (randomizer() < (highestRandomNumber / 2.0))) || ((end - i) >= neededCharacters)) {
66  if (needSmallLetter)
67  category = 0;
68  if (needCapitalLetter && ((category == -1) || (randomizer() < (highestRandomNumber / 2.0))))
69  category = 1;
70  if (needNumber && ((category == -1) || (randomizer() < (highestRandomNumber / 4.0))))
71  category = 2;
72  if (needSymbol && ((category == -1) || (randomizer() < (highestRandomNumber / 8.0))))
73  category = 3;
74  } else {
75  if (useSmallLetters)
76  category = 0;
77  if (useCapitalLetters && ((category == -1) || (randomizer() < (highestRandomNumber / 2.0))))
78  category = 1;
79  if (useNumbers && ((category == -1) || (randomizer() < (highestRandomNumber / 4.0))))
80  category = 2;
81  if (useSymbols && ((category == -1) || (randomizer() < (highestRandomNumber / 8.0))))
82  category = 3;
83  }
84  switch (category) {
85  case 0:
86  *i = letters[rand() % 26];
87  if (needSmallLetter) {
88  needSmallLetter = false;
89  --neededCharacters;
90  }
91  break;
92  case 1:
93  *i = capitalLetters[rand() % 26];
94  if (needCapitalLetter) {
95  needCapitalLetter = false;
96  --neededCharacters;
97  }
98  break;
99  case 2:
100  *i = numbers[rand() % 9];
101  if (needNumber) {
102  needNumber = false;
103  --neededCharacters;
104  }
105  break;
106  case 3:
107  *i = symbols[rand() % 22];
108  if (needSymbol) {
109  needSymbol = false;
110  --neededCharacters;
111  }
112  break;
113  }
114  }
115 }
116 
121 void generateRandomCharacterSequence(char *result, unsigned int length, bool useSmallLetters, bool useCapitalLetters, bool useNumbers,
122  bool useSymbols, bool useAtLeastOneOfEachCategory)
123 {
125  result, length, rand, RAND_MAX, useSmallLetters, useCapitalLetters, useNumbers, useSymbols, useAtLeastOneOfEachCategory);
126 }
127 } // namespace RandomUtilities
CPP_UTILITIES_EXPORT void generateRandomCharacterSequence(char *result, unsigned int length, bool useSmallLetters=true, bool useCapitalLetters=true, bool useNumbers=true, bool useSymbols=true, bool useAtLeastOneOfEachCategory=true)
Generates a random character sequence using std::rand().
Definition: random.cpp:121
constexpr int i
Contains utility functions for generating random character sequences.
Definition: random.h:8