C++11中,获取随机数的新方法default_random_engine

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 随机数




  • 21
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值