在c语言和c++中都有rand()函数和srand()函数。
1、 在使用这两个个函数时需要添加头文件#include<stdlib.h>
(C++建议使用#include<cstdlib>);
2、在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。
定义为:int rand(void)返回值为0~RAND_MAX(整形数)
可以利用rand()%m的方法,生成0~m的一个随机的整数序列。但是我们会发现一个问题:第一次生成的数值确实是随机的但是下一次产生的数值还是一样的。
#include<iostream>
#include<cstdlib>
using namespace std;
int main(int argc,char*argv[])
{
int t;
t=rand()%10; //产生0~10的随机数
cout<<t;
return 0;
}
通过结果可知第一第二次甚至第三次结果都是一样的。
只能使用一次确实不好。那么怎么使得每次产生的数值都是随机的呢?
这个时候就需要srand()函数了。
srand函数是随机数发生器的初始化函数。定义为:void srand(unsigned seed);
srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用geypid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
例:srand(1); 直接使用1来初始化种子。不过为了防止随机数每次重复常常使用系统时间来初始化,即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即: srand((unsigned) time(&t)); 还有一个经常用法,不需要定义time_t型t变量,即: srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。(注:此时需要使用头文件#include<time.h>或#include<ctime>)
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main(int argc,char*argv[])
{
int a[5];
srand((unsigned)time(NULL));
for(int i=0;i<5;i++)
a[i]=rand()%10;
for(int j=0;j<5;j++)
cout<<a[j]<<endl;
return 0;
}
通过此方法就可以实现产生的a[i]是一组0~10的随机数组。那么想要生成[n,m](n<m)的随机序列该怎么做呢?
a[i]=n+rand()%(m-n);
例:[2,7]
只需要将a[i]=rand()%10;改为:a[i]=2+rand()%(7-2);
需要补充的是,如果srand()放在循环的内部或者写成只有
srand((unsigned)time(NULL));
a=rand()%10;
我们会发现每次运行的结果还是相同的,为什么呢?
电脑的随机数都是伪随机,也就是通过一定的算法得出一个数列,然后每 rand()一次就取一个数。而srand()的功能就是就是设置产生随机数的公式的参数(随机数种子),如果使用相同的种子,那么得到的随机数也就是相同的。自然,如果使用不同的种子,得出的随机数序列也是不同的。