Noteed

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 3

How do I create a random alpha-numeric string in C++?

ook-up tables can sometimes do wonders:

#include <ctime>
#include <iostream>
#include <unistd.h>

std::string gen_random(const int len) {


static const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
std::string tmp_s;
tmp_s.reserve(len);

for (int i = 0; i < len; ++i) {


tmp_s += alphanum[rand() % (sizeof(alphanum) - 1)];
}

return tmp_s;
}

int main(int argc, char *argv[]) {


srand((unsigned)time(NULL) * getpid());
std::cout << gen_random(12) << "\n";
return 0;
}
Note that rand generates poor-quality random numbers.

I've added the lambda in here, but the principle is that you could pass it in and
thereby control what characters your string contains:

std::string random_string( size_t length )


{
auto randchar = []() -> char
{
const char charset[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
const size_t max_index = (sizeof(charset) - 1);
return charset[ rand() % max_index ];
};
std::string str(length,0);
std::generate_n( str.begin(), length, randchar );
return str;
}
Here is an example of passing in a lambda to the random string function:
http://ideone.com/Ya8EKf

Why would you use C++11?

Because you can produce strings that follow a certain probability distribution (or
distribution combination) for the character set you're interested in.
Because it has built-in support for non-deterministic random numbers
Because it supports unicode, so you could change this to an internationalized
version.
For example:

#include <iostream>
#include <vector>
#include <random>
#include <functional> //for std::function
#include <algorithm> //for std::generate_n

typedef std::vector<char> char_array;

char_array charset()
{
//Change this to suit
return char_array(
{'0','1','2','3','4',
'5','6','7','8','9',
'A','B','C','D','E','F',
'G','H','I','J','K',
'L','M','N','O','P',
'Q','R','S','T','U',
'V','W','X','Y','Z',
'a','b','c','d','e','f',
'g','h','i','j','k',
'l','m','n','o','p',
'q','r','s','t','u',
'v','w','x','y','z'
});
};

// given a function that generates a random character,


// return a string of the requested length
std::string random_string( size_t length, std::function<char(void)> rand_char )
{
std::string str(length,0);
std::generate_n( str.begin(), length, rand_char );
return str;
}

int main()
{
//0) create the character set.
// yes, you can use an array here,
// but a function is cleaner and more flexible
const auto ch_set = charset();

//1) create a non-deterministic random number generator


std::default_random_engine rng(std::random_device{}());

//2) create a random number "shaper" that will give


// us uniformly distributed indices into the character set
std::uniform_int_distribution<> dist(0, ch_set.size()-1);

//3) create a function that ties them together, to get:


// a non-deterministic uniform distribution from the
// character set of your choice.
auto randchar = [ ch_set,&dist,&rng ](){return ch_set[ dist(rng) ];};

//4) set the length of the string you want and profit!
auto length = 5;
std::cout<<random_string(length,randchar)<<std::endl;
return 0;
}
Sample output.

You might also like