这个需求也是最近一个项目里的实际需求。测试一个数据库相关的代码。要往数据库里随机的填写一些字段。
从原理上是很容易实现。建立一个数组,存放一些字符。然后随机的从里面取一些字符凑成一个字符串。
所以这个代码没啥可说的。里面用到了 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
#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);
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;
首先,我们知道可以使用随机函数随机生成自然数,整数,小数,负数等常见的数据类型,那怎么使用它生成包含26个英文字母大小写的字符串呢? 其实,这很简单,程序也很朴素。 每一个字符都对应了它的ascii码,而ascii码则是整数,所以我们可以通过得到字符的ascii码,将它转换成字符就行了。程序如下:#include<cstdio>
#include<time.h>
设定一个数组:
public static string[] str = new string[] { "1", "b", "a", "f", "3", "4", "5", "8", "0", "2", "6", "m", "k", "l", "x" };
最近给自己的网站搞一个相册,随机生成图片名字,生成100W个16位的名字,测试没重复,感觉还不错,生成的数字是均匀分布的cppreference
#include <random>
#include <iostream>
#include <unistd.h>
#include <unordered_set>
using namespace std;
char seed[64] = {
'0','1','2','3','4','5','6','7','
std::string randomStr(int character_count ,bool is_contain_chinese = false)
std::vector<std::string> chinese_table ={
"一","乙","二","十","丁","厂","七","卜","人","入","八","九","几","儿","了","力","乃","刀","
写入自定义字母:string ranstr = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890"printf(str.c_str());//用c_str是转换string用的,printf的参数是const char类型。先加载库:string.h、Windows.h、iostream。之后重新定义一个空字符串:string str = "";i<输出字符串长度;//62是ranstr的长度。
转自:c++ 随机生成字符串有数字和字母组成
这里的每个数字被选取的几率大于每个字母被选取的几率,但小写字母、大写字母、数字三类的几率一样,
要改善这个问题我觉得可以开一个62大小的字符数组,然后随机数直接mod62填写该下标对应的字符
#include <iostream>
#include <stdlib.h>
#include <t...
std::mt19937是伪随机数产生器,用于产生高性能的随机数。 C++11引入。
返回值为unsigned int。std::mt19937接收一个unsigned int数作为种子。所以可以如下定义:
mt是因为这个伪随机数产生器基于Mersenne Twister算法。
19937是因为产生随的机数的周期长,可达到2^19937-1。...