生成随机数对比
以前获取伪随机数都是用的rand,想要获取两个数之间的伪随机数
- 案例:
int min,max; //定义上下边界 int range=max-min; //获取中间的范围 int randNum = rand() % range + min; //生成介于min和max之间的伪随机数
目前“C++程序不应该使用库函数rand,而应使用default_random_engine
类和恰当的分布类对象”。用这种新方法获取两个数之间的伪随机数的方法如下:
- 案例:
int min,max; //定义上下边界 default_random_engine e; //创建引擎 uniform_int_distribution<unsigned> u(min,max); //创建取值范围 int randNum=u(e); //获取伪随机数
对比
- 从代码量来说,并没有减少,但是感觉更加直观了一些,毕竟可以直接设置上下边界,不用再通过取余之类的计算了。
- 有一个问题,就是多次调用同一对范围和引擎时,每次生成的数都是一样的。避免这个情况的话,需要在定义范围和引擎时,将其定义为static的,如下:
static default_random_engine e; static uniform_int_distribution<unsigned> u(min,max);
- 关于设置种子,既可以在定义时设置种子,也可以创建完成后再设置种子:
default_random_engine e1(32767); //创建引擎时设置种子 default_random_engine e2; e2.seed(32767); //创建后再设置种子 // 如果要设置时间种子,方法如下: default_random_engine e(time(0)); //设置当前时间为引擎种子
生成随机数相关函数
- 随机生成数涉及的函数:
default_random_engine
anduniform_int_distribution
uniform_int_distribution
- 离散均匀分布类,类模板定义了分布对象,它返回的是均勻分布在闭合范围 [a,b] 内的随机整&。模板参数的类型是生成的整数的类型,默认类型是 int: 定义在类中的类型别名
result_type
和分布所生成的值的类型相对应。模板类型参数只接受整数类型。 - 生成值的类型是 int,范围从 0 到 int 类型的最大值。上边界是 int 类型的最大值,由定义在
limits
头文件中的函数模板numeric_imits()
生成。获取范围的界限有很多更加简单的方式。可以调用所有分布对象都有的成员函数min()
和max()
uniform_int_distribution
类模板定义了成员函数a()
和b()
,它们可以分别返回范围的下边界和上边界,与上述一致。- 如果只想分布的整数范围大于或等于给定值,只需要提供构造函数的第一个参数
std::uniform_int_distribution<> d {20};
- 离散均匀分布类,类模板定义了分布对象,它返回的是均勻分布在闭合范围 [a,b] 内的随机整&。模板参数的类型是生成的整数的类型,默认类型是 int: 定义在类中的类型别名