最近刚编写了一个VC程序,其中用到了rand函数,在这个过程中发现自己以前用rand函数的时候,方法都是错误的,现在和大家交流一下正确的用法。
我们知道编写VC程序的时候,我们经常会用到rand函数,来生成随机数,以满足我们程序的需要,下面以一个简单的程序为例子:
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
int i;
printf("Ten randomnumbers from 0 to 99nn");
for(i=0;i<10; i++)
printf("%dn", rand() %100);
return 0;
}
这是一个生成10个范围在0-99的随机数的例子,通过VC编译通过后,运行程序,我们会看见结果是10个满足要求的随机数,这说明这个程序很好的完成了要求。
但是当我们反复运行这个程序的时候,我们就会发现问题所在:不管运行程序多少次,程序每次执行的结果都是一样的,程序生成的数并不是真正意义上的随机,而是生成的一组伪随机数。即rand函数的实质是生成一个在范围内的伪随机数。
什么是伪随机数?我个人的理解是,计算机产生一个随机数是通过算法产生的,而这个算法是固定的,影响这种算法的是随机数种子,它决定了你的随机序列的产生。所以在随机数种子固定的情况下(系统默认随机数种子的值为1),计算机产生的随机数是可以预测的,即不是真正意义上的随机。。
问题的解决:想要解决这个问题,我们就不得不说另外一个函数:srand函数,这个函数就是专门针对rand函数而设置的,它的作用就是产生一个随机数种子,随机数种子不同,调用rand函数产生的结果是不同的,所以你如果想生成真正意义上的随机序列,那么在调用rand函数前,最好调用一下srand函数。
我们使用srand函数的时候常常使用系统时间来初始化,即使用time函数来获得系统时间,它的返回值为从 00:00:00GMT, January 1,1970到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型在传给srand函数,即:srand((unsigned)time(&t));还有一个经常用法,不需要定义time_t型t变量,即:srand((unsigned) time(NULL));
在加入上面的语句之后,你会发现你每次执行程序后产生的结果都是不一样的!
PS:在使用rand,srand函数是不要忘记链接头文件#include<stdlib.h>;使用time函数要添加头文件#include<time.h>。
修改后的程序如下:
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
intmain(void)
{
int i;
printf("Ten random numbers from0 to 99nn");
srand((unsigned) time(NULL));
for(i=0; i<10;i++)
printf("%dn",rand() % 100);
return 0;
}
BIT-黄英杰
2011年3月14日14:23:51