C++11中,提供了一种新的获取随机数的方法。
以前获取伪随机数都是用的rand,想要获取两个数之间的伪随机数,方法如下:
int min,max;
//定义上下边界
int range=max-min;
//获取中间的范围
int randNum = rand() % range + min;
//生成介于min和max之间的伪随机数
今天看《C++ Primer 5th Edition》里面介绍了使用default_random_engine来获取随机数,并且指出“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));
//设置当前时间为引擎种子
然而time返回时间的单位是秒,所以如果是自动过程的一部分反复运行,比如用在循环中,那么因为间隔时间不够,所以设置的种子其实是一样的。
参考书籍:
《C++ Primer 5th Edition》 17.4 随机数