C++ 随机数

以前一般使用随机数用rand函数,rand函数有很多缺点。现在标准库引入了新的随机数引擎,对于生产随机数更加方便且功能强大了。

它一般由引擎+分布类型的方式来生成随机数。
头文件

#include <random>

直接用引擎生成随机数:

#include<bits/stdc++.h>
using namespace std;
int main(){
    default_random_engine e;//生成随机无符号数字
    for(int i=0;i<=10;i++)cout<<e()<<endl;
    return 0;
}

随机数范围:

#include<bits/stdc++.h>
using namespace std;
int main(){
    //C语言rand 的函数生成的数字的范围是在0 --  randMAX之间。
    //随机数引擎是在系统定义的范围内
    default_random_engine e;
    cout<<e.min()<<" "<<e.max()<<endl;
    return 0;
}

随机数引擎生成的数是伪随机数引擎。

#include<bits/stdc++.h>
using namespace std;
vector<unsigned> re(){
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0,100);
    vector<unsigned> ret;
    for(int i=1;i<=10;i++)ret.push_back(u(e));
    return ret;
}
int main(){
    vector<unsigned> a=re(),b=re();
    for(auto x:a)cout<<x<<" ";cout<<endl;
    for(auto x:b)cout<<x<<" ";cout<<endl;
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
vector<unsigned> re(){
    static default_random_engine e;//要是引擎和分布对象保持状态,所以把它定义为static
    static uniform_int_distribution<unsigned> u(0,100);
    vector<unsigned> ret;
    for(int i=1;i<=10;i++)ret.push_back(u(e));
    return ret;
}
int main(){
    vector<unsigned> a=re(),b=re();
    for(auto x:a)cout<<x<<" ";cout<<endl;
    for(auto x:b)cout<<x<<" ";cout<<endl;
    return 0;
}
定义种子:
#include<bits/stdc++.h>
using namespace std;
int main(){
    default_random_engine e1,e2(1000);//种子不同,序列不同
    default_random_engine e3;
    e3.seed(32767);
    default_random_engine e4(32767);//种子相同,序列相同
    for(int i=0;i<100;i++){
        if(e1()==e2())cout<<i<<"  "<<"yes1"<<endl;
        if(e3()==e4())cout<<i<<"  "<<"yes2"<<endl;
    }
    default_random_engine e5(time(0));//稍微随机一的种子
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    default_random_engine e;
    uniform_real_distribution<double> u(0,1);
    for(int i=1;i<=10;i++) cout<<u(e)<<" ";cout<<endl;
    cout<<u.min()<<" "<<u.max()<<endl;

    //使用默认的分布类型
    uniform_int_distribution<> u1(0,1);//默认的是int
    for(int i=1;i<=10;i++) cout<<u1(e)<<" ";cout<<endl;
    return 0;
}
生成非均匀分布的随机数

normal_distribution分布生成的是浮点值

#include<bits/stdc++.h>
using namespace std;
int main(){
    normal_distribution <> u(4,1.5);//均值是4 标准差是1.5
    default_random_engine e;
    int a[10];
    for(int i=0;i<10;i++)a[i]=0;
    for(int i=0;i<=200;i++){
        int x=lround(u(e));
        if(0<=x&&x<10)a[x]++;
    }
    for(int i=0;i<10;i++)cout<<i<<" "<<a[i]<<endl;
    return 0;
}

不接受模板参数的bool随机数
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a=0,b=0;
    default_random_engine e;
    bernoulli_distribution u;
    for(int i=0;i<=1100;i++)
        if(u(e))a++;
        else b++;
    cout<<a<<" "<<b<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值