C语言之随机数的产生
如何让系统产生一个随机数:
在C语言中,我们一般使用<stdlib.h>头文件中的rand()函数来生成随机数,rand()函数取随机数的范围在0~RAND_MAX,其中RAND_MAX的值为2147483647。
rand()函数的用法:
int a;
a=rand();
例如:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a;
a =rand();
printf("随机数值为:%d", a);
}
这时有细心的朋友发现了,程序每次运行时产生的随机数值是一样的。
实际上,rand()函数产生的随机数是伪随机数,是根据某一个值按照某个公式推算出来的,这个数值我们称之为“种子”,“种子”和随机数之间的关系是一个正态分布的关系。种子在每次启动计算机的时候是随机的,但是一旦计算机启动之后,他就不在变化,因此产生的随机数值也是固定的。
如果要想产生真正的随机数,这时我们需要“重新播种”。
我们可以通过srand()函数来重新播种,这样的话种子就会发生变化。srand()的用法为:
void srand(unsigned int seed);
它需要一个unsignedint 类型的参数。在实际开发的过程中,我们可以用时间作为参数,只要每次的播种时间不同,那么生成的种子就不同,从而产生的随机数就不同。
使用<time.h>头文件中的time()函数即可得到当前的时间(精确到秒),就像下面这样:
srand((unsigned) time(NULL));
例如:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int a;
srand((unsigned)time(NULL));
a =rand();
printf("随机数值为:%d", a);
return 0;
}
多次运行程序,会发现每次生成的随机数都不一样了。但是,这些随机数会有逐渐增大或者逐渐减小的趋势,这是因为我们以时间为种子,时间是逐渐增大的,又因为“种子”和随机数之间是一个正态分布的关系,所以我们就很容易推断出随机数也会逐渐增大或者减小。
生成一定范围内的随机数
在实际的开发过程中,我们往往需要一定范围内的随机数,过大或者过小都不符合要求,那么,如何产生一定范围的随机数呢?我们可以利用取模的方法:
inta = rand() % 10;//产生0~9的随机数,注意这里的10可以被整除。
例如:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intmain()
{
int a;
srand((unsigned)time(NULL));
a = rand()%10;
printf("随机数值为:%d", a);
return 0;
}
如果要规定上下限:
inta = rand() % 51+13;//产生的是13~63的数据
分析:取模即取余,rand()%51+13我们可以看成两部分:rand()%51是产生 0~50 的随机数,后面+13保证 a最小只能是 13,最大就是 50+13=63。
例如:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intmain()
{
int a;
srand((unsigned)time(NULL));
a = rand()%51+13;
printf("随机数值为:%d", a);
return 0;
}
生成连续的随机数
有时候我们需要一组随机数(多个随机数),该怎么生成呢?很容易想到的一种解决方案是使用循环,每次循环都重新播种,请看下面的代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int a, i;
for (i = 0; i <= 10; i++)
{
srand((unsigned)time(NULL));
a = rand()%10;
printf("%d", a);
}
}
这时产生的随机数都是一样的,这就非常奇怪了,每次循环我们都重新播种了呀,为什么生成的随机数都一样呢?这是因为,for 循环运行速度非常快,在一秒之内就运行完成了,而 time() 函数得到的时间只能精确到秒,所以每次循环得到的时间都是一样的,这样一来,种子也就是一样的,随机数也就一样了。
好了!今天的讲述就到这里了。