C++/Qt随机数

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的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值