C++中的srand()和rand()用法解析

时间:2014.03.04

地点:基地

--------------------------------------------------------------------------------

一、简述

  最近在一个应用程序中要用到随机数,于是抽出来找了些资料,具体了解srand()和rand()的用法。这两个函数在头文件<cstdlib>中,该两个函数常结合使用,用以生产伪随机数。

--------------------------------------------------------------------------------

二、具体用法

1. void srand(unsigned seed);

用来指定种子的函数,若不显式调用则系统默认调用srand(1)来指定rand()的初始化种子。srand函数指定的种子会对应一个随机数系列,所以当你用srand指定一样的种子是,rand出来的随机数序列总是一样的。当然为了防止一样,一方面我们可用流逝的时间作为种子,即用time函数来获取系统时间,time函数会返回一个time_t的数据,表示1970年1月1日0时0分0秒开始到目前的时间间隔,单位为妙,然后我们将这个time_t类型的数据转换为unsigned类型就可以srand成种子了,即srand((unsigned)time(0)。还有一个办法是利用程序的ID来作为初始化种子,即srand((unsigned)getpid())

1. int rand(void);

从srand(seed)中指定的seed为范围的开始,返回一个[seed,RAND_MAX)区间中的随机数值。

--------------------------------------------------------------------------------

三、机理

我们可以认为每次调用rand()函数时,该函数会查看srand的记录

1.若用户在此之前显式调用了srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次初始化它的范围起始值。

2.若在此之前没有调用过srand(seed),它就自动调用srand(1)一次。

--------------------------------------------------------------------------------

四、示例

假如你想要获取[0,6)间的随机数

1.不指定seed

for(int i=0;i<10;i++){
  ran_num=rand%6;
  cout<<ran_num<<endl;
}

2.指定seed为定值

srand(6)
for(int i=0;i<10;i++){
  ran_num=rand%6;
  cout<<ran_num<<endl;
}

3.指定seed为变值

#include<ctime>
......
srand((unsigned)time(0));
for(int i=0;i<10;i++){
  ran_num=rand%6;
  cout<<ran_num<<endl;
}

五、获取伪随机浮点数

有时我们需要获得伪随机数浮点数

这里用rand()/double(RAND_MAX)可满足[0,1)直接的随机数获取,稍微处理可获取任意其他范围浮点随机数,例:

double ran_numf=0.0;
srand((unsigned)time(0));
for(int i=0;i<10;i++){
  ran_numf=rand()/(double)(RAND_MAX);
  cout<<ran_numf<<endl;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值