以前一般使用随机数用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;
}