一、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());