C++ 生成随机字符串
这个需求也是最近一个项目里的实际需求。测试一个数据库相关的代码。要往数据库里随机的填写一些字段。
从原理上是很容易实现。建立一个数组,存放一些字符。然后随机的从里面取一些字符凑成一个字符串。
所以这个代码没啥可说的。里面用到了 std::random_device,std::mt19937 ,std::uniform_int_distribution 可以作为 C++ 生成随机数的一个例子。还用到了初始化列表来初始化一个 QVector , 这个也可以作为一个例子。
#ifndef RANDOMSTRING_H
#define RANDOMSTRING_H
#include <QVector>
#include<random>
/**
* @brief The RandomString class 用来生成随机字符串,可以指定随机字符串里包含哪些字符
* 用法举例: RandomString rng;
* rng.setCharSet("0123456789ABCDEF");
* QString rng.randn(10);
*/
class RandomString
{
public:
RandomString();
RandomString(unsigned int seed);
/**
* @brief randn 返回一个有 N 个字符的随机字符串
* @param N 字符串的长度
* @return
*/
QString randn(int N);
void resetCharSet();
void addChar(QChar c);
void addCharSet(QVector<QChar> set);
enum CHARSET {number, lowercase, uppercase};
void addCharSet(CHARSET set);
void addCharSet(QString set);
private:
QVector<QChar> m_charSet;
static QVector<QChar> m_number;
static QVector<QChar> m_lowercase;
static QVector<QChar> m_uppercase;
std::random_device randomDevice;
std::mt19937 randomGenerator;
};
#endif // RANDOMSTRING_H
#include "randomstring.h"
#include <QtDebug>
QVector<QChar> RandomString::m_number({'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'});
QVector<QChar> RandomString::m_lowercase({'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'});
QVector<QChar> RandomString::m_uppercase({'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'});
RandomString::RandomString()
:randomGenerator(randomDevice())
{
}
RandomString::RandomString(unsigned int seed)
:randomGenerator(seed)
{
}
void RandomString::addCharSet(QString set)
{
QString::const_iterator it;
for (it = set.constBegin(); it != set.constEnd(); ++it)
{
addChar(*it);
}
}
QString RandomString::randn(int N)
{
int M = m_charSet.size();
std::uniform_int_distribution<int> dist(0, M - 1);
QString ret;
while(N > 0)
{
int rand = dist(randomGenerator);
QChar x = m_charSet.at(rand);
//qDebug() << "rand = " << rand << ", x = " << x;
ret.append(x);
--N;
}
return ret;
}
void RandomString::resetCharSet()
{
m_charSet.clear();
}
void RandomString::addChar(QChar c)
{
m_charSet.append(c);
}
void RandomString::addCharSet(QVector<QChar> set)
{
m_charSet.append(set);
}
void RandomString::addCharSet(CHARSET set)
{
switch (set)
{
case number:
m_charSet.append(m_number);
break;
case lowercase:
m_charSet.append(m_lowercase);
break;
case uppercase:
m_charSet.append(m_uppercase);
break;
default:
break;
}
}