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