1、c++标准库随机数
标准库随机数由引擎和分布两部分构成。头文件:#include <random>
生成0~9的均匀分布的随机数:
std::uniform_int_distribution<int> u(0,9);//均匀分布
std::default_random_engine e;//随机数引擎
qDebug()<<"随机数引擎可产生随机数的范围:"<<e.max()<<e.min();
for(int i = 0;i < 10;++i)
qDebug()<<u(e);
生成一个随机数序列,引擎和分布都是static否则每次生成的序列相同:
std::vector<int> getRandVec()
{
std::vector<int> ret;
static std::uniform_int_distribution<int> u(0,9);//均匀分布
static std::default_random_engine e;//随机数引擎
for(int i = 0;i < 10;++i)
ret.push_back(u(e));
return ret;
}
随机数种子:
设置的随机数种子相同则生成的随机数相同。
下面e1和e2生成的随机数是相同的:
std::uniform_int_distribution<int> u(0,9);//均匀分布
std::default_random_engine e1;//随机数引擎
std::default_random_engine e2;
QList<int> list1,list2;
for(int i = 0;i < 10;++i)
{
list1<<u(e1);
list2<<u(e2);
}
qDebug()<<list1;
qDebug()<<list2;
设置不同种子后则不同(但每次生成的数据都是相同的):
std::uniform_int_distribution<int> u(0,9);//均匀分布
std::default_random_engine e1;//随机数引擎
e1.seed(666);
std::default_random_engine e2;
e2.seed(888);
for(int i = 0;i < 10;++i)
{
qDebug()<<u(e1);
qDebug()<<u(e2);
}
所有分布:
均匀分布 uniform_int_distribution<IntT> u(m, n); uniform_real_distribution<RealT> u(m, n); m默认0,n默认IntT对象可以表示的最大值;m默认0.0,n默认1.0 伯努利分布 Bernoulli_distribution b(p);//以概率p生成true,默认0.5 Bernoulli_distribution<IntT> b(t, p);//分布的采样大小为整型值t。t默认1,p默认0.5 geometric_distribution<IntT> g(p);//每次试验成功概率为p,默认0.5 negative_binomial_distribution<IntT> nb(k, p);//k次试验成功概率为p。k默认1,p默认0.5 泊松分布 poisson_distribution<IntT> p(x);//均值为double值x exponential_distribution<RealT> e<lam);//指数分布,lambda浮点值,默认1.0 gamma_distribution<RealT> g(a, b);//形状参数为a,尺度参数为b,默认均为1.0 weibull_distribution<RealT> w(a, b);// 形状参数为a,尺度参数为b,默认均为1.0 extrme_value_distribution<RealT> e(a, b);//a的默认值为0.0,b默认1.0 正态分布 normal_distribution<RealT> n(m, s);//均值m,标准差s;默认0.0,1.0 lognormal_distribution<RealT> ln(m, s);// chi_squared_distribution<RealT> c(x);//自由度x,默认1.0 cauchy_distribution<RealT> c(a, b);//位置参数a和尺度参数b默认分别0.0,1.0 fisher_f_distribution<RealT> f(m, n);//自由度为m和n,默认值均为1 student_t_distribution<RealT> s(n);//自由度为n,默认值1 抽样分布 discrete_distribution<IntT> d(i, j); discrete_distribution<IntT> d(il); i和j是权重序列的输入迭代器,il是权重的花括号列表。权重必须能转换为double piecewise_constant_distribution<RealT> pc(b, e,w);//b e w输入迭代器 piecewise_linear_distribution<RealT> pc(b, e,w);//b e w输入迭代器
大部分用的不太多,其中要注意std::bernoulli_distribution,返回的是bool值,概率各占50%。
std::bernoulli_distribution b;
std::default_random_engine e1;
for(int i = 0;i < 10;++i)
{
qDebug()<<b(e1);
}
2、Qt随机数
qDebug()<<QRandomGenerator::global()->bounded(10); //生成一个0和10之间的整数
qDebug()<<QRandomGenerator::global()->bounded(10.123); //生成一个0和10.123之间的浮点数
qDebug()<<QRandomGenerator::global()->bounded(10, 15); //生成一个10和15之间的整数
非常方便,所以除非要生成某些特定分布的随机数,否则应该尽可能用Qt的。