C++随机数的产生及rand()函数的使用

一、C++程序代码

#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;

int main(){
	srand((unsigned int)time(0)); //使用系统时间来初始化种子
//	srand((unsigned int)getpid());//用进程的pid作为种子值seed
	cout<<rand()%10/10.0<<endl;		//获取0-1之间的随机数,取1位有效数字
	cout<<rand()%100/100.0<<endl;	//获取0-1之间的随机数,取2位有效数字
	cout<<rand()%100<<endl;			//产生0-99之间的随机数
	cout<<rand()%100+1<<endl;		//产生1-100之间的随机数
	
	return 0;
}

运行结果

1、使用time(0)

第一次运行

第二次运行

2、把time(0)换成getpid()后

第一次运行

第二次运行

3、不用time(0)或getpid()初始化种子,即种子初始化过程全部去掉

第一次运行

第二次运行

可以看到,不初始化种子,2次运行结果完全一样,而用时间time(0)或者getpid()来初始化种子则能够产生我们想要的随机数,这是为什么呢?让我们接着看下一部分解说。

二、rand()与srand()函数解析

下面对函数rand和srand进行说明

rand函数

C语言中用来产生一个随机数(整型)的函数。

rand函数界限

stdlib.h头文件中有宏#define RAND_MAX 0x7fff,rand会产生一个0-0x7fff的随机数,即最大是32767的一个数

rand函数原型

#include <stdlib.h>
int rand(void);

rand函数调用

rand()函数每次调用前都会查询是否调用过srand(seed),是否给seed设定了一个值,如果有那么它会自动调用srand(seed)一次来初始化它的起始值;若之前没有调用srand(seed),那么系统会自动给seed赋初始值,即自动调用srand(1)一次

srand函数

srand函数是随机数发生器的初始化函数,原型:

void srand(unsigned int seed);

这个函数需要提供一个种子,如srand(1),用1来初始化种子。
       rand() 产生随机数时,如果用srand(seed)播下种子之后,一旦种子相同(不指定seed或者指定为无符号整型常量),产生的随机数将是相同的。当然一般情况下大家自然是想让rand()产生的随机数随机化,所以一般是用时间作种子 srand(time(NULL)),因为每次运行程序的时间肯定是不相同的,产生的随机数也就不一样了。
       我们常常使用系统时间来初始化,使用time函数来获取系统时间,得到的值是一个时间戳,即从1970年1月1日0点到现在时间的秒数,然后将得到的time_t类型数据转化为(unsigned int)的数,然后再传给srand函数,用法如下:

srand((unsigned int)time(NULL));//我们在使用rand和srand时,主要使用的就是这一种初始化方法

如果仍然觉得时间间隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某个合适的整数。 例如,

srand((unsigned)time(NULL)*10);

time的参数传NULL表示不需要经过传参得到time_t数据,time函数原型如下

time_t time(time_t *tloc);//time_t类型被定义为一个长整型

还有另外一种初始化种子的方式如下,用进程的pid作为种子值seed

srand((unsigned int)getpid());

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值