C++11之前生成随机数
**1.**仅使用rand()生成随机数不需要引入特定头文件直接使用即可。
如 `int i=rand();`
但是生成随机数的种子默认是1 随机数范围是0到rand_max(int型是32767)
**2.**使用种子来使每次生成的随机数不同(一般使用时间作为种子) 所在头文件stdlib.h
#include <stdlib.h>
......
srand(time(NULL));
int i=rand();
**3.**可以使用rand()%n来获取特定范围的随机数 如%n即是模n取余操作,相应可以还有加减来标定范围。
新标准下
定义在头文件中的random库
#include<iostream>
#include<random>
using namespace std;
int main() {
default_random_engine e;//随机数引擎(是函数对象类)
for (int i = 0; i < 10; ++i)
cout << e() << endl;//不接受参数,返回一个unsigned整数
return 0;
}
生成指定范围内的随机数
int main() {
uniform_int_distribution<unsigned> u(0,9);//随机数分布类
//范围是[0,9]
default_random_engine e;
for (int i = 0; i < 10; ++i)
cout << u(e) << endl;//注意不是u(e())
return 0;
}
随机数发生器是指分布对象和引擎对象的组合
对于给定的发生器,每次运行返回相同的数值序列,比如下面的两个数组元素相同;
vector<int> bad(){
uniform_int_distribution<int> u(-9,9);
default_random_engine e;
vector<int> a;
for (int i = 0; i < 10; ++i)
a.push_back(u(e));
return a;
}
int main() {
vector<int>a1 = bad();
vector<int>a2 = bad();
return 0;
}
可以改为一下形式使生成不同的序列
static uniform_int_distribution<int> u(-9,9);
static default_random_engine e;
不过此时仅仅是一次程序运行过程中每次调用函数返回的序列不同,但是此时若多次运行此程序并输出a1、a2,每次运行输出结果相同
可设置随机数发生器种子,以下为设置种子的方法
default_random_engine e1;//使用默认种子
default_random_engine e2(1534);//使用给定种子
default_random_engine e3;
e3(1534);//e3与e2种子相同,将生成与e2相同的序列
常使用时间作为种子
uniform_int_distribution<int> u(0, 9);
default_random_engine e(time(0));
for (int i = 0; i < 10; ++i)
cout << u(e) << " ";