c语言入门:[23]随机数
随机数我们在编程中还是比较常用的,比如随机生成验证码、随机彩票号码等。只是要想无任何规律地产生出一些数字,做到真正意义上的随机实在是太难了,既然是由我们程序代码产生的数那肯定是有一些规则的,所以称为伪随机。
现在我们就以一个规则来产生一系列0~9的数,请看下面的代码:
int main()
{
int a,b,i;
a=1;
for(i=1;i<=100;i++)
{
a=a*214013+2531011;
b=a%10;
printf("%d ",b);
}
printf("\n");
}
你运行一下上面的代码,是不是产生了100个0~9的数,而这些数字看起来是随机的。下面对代码做下解释:
变量a的值的改变是关键,a初始值是1,每循环一次执行一次a=a*214013+2531011;执行一次a的值就会变化,当然如果a*214013+2531011的运算结果超过了整数能够表示的数的范围话,其运算结果就不准确了也有可能结果是一个负的整数,但这并不影响我们改变a的值得目的。这里我们想产生0~9之间的数那我们就用变化后的a的值跟10取余数,就是代码中的b=a%10。运行一下看到下图所示结果。
这个数字序列看起来是随机的了,已经达到了我们的目的。可是如果多次运行这个程序你就会发现每次的结果都是上面的一组数,数字序列没有变化。这是因为每次运行程序变量a的初始值都是1,而a的值又按照a=a*214013+2531011;相同的规则变化,所以每次运行都得到一组相同的数。我们的规则只能是一个,那就在a的初始值上做文章呗,我们可以把a的初始值设置为当前系统时间,这样每次运行程序a的初始值不一样得到的一组数自然就不一样了,那我们还得学习怎么取得当前系统时间,time函数就可以满足我们的要求。
time函数存在于time.h头文件中,请看下面的代码
#include "time.h"
int main()
{
long int t=time(0);
printf("%ld\n",t);
}
1、long int 就是长整型,在变量与运算符初探那节我介绍过int类型的范围,这里由于要处理的整数比较大int类型可能范围不够用所以time函数的返回值是一个长整型,在printf里输出长整型就用“Ld”输出,L大小写都没关系。其实在这个版本的cfree里int和long int 都是一样的。
2、time函数有一个返回值,返回值是一个长整型的数即表示当前机器时间的数字,这个数字是指从1970年1月1日0时0分0秒开始算起到当前电脑时间为止期间一共经历了多少秒。
2、time函数有一个参数,这个参数可以为空,这里参数位置写0就表示参数为空,知道scanf吗呵呵很熟悉吧,int a;scanf("%d",&a);知道什么意思吗,那 long int a; time(&a); 也差不多,就是把当前机器时间赋值给了a
3、输出后你会发现是一个数字,下图是我运行后的输出结果:
既然回了time函数那就把我们之前的代码略做修改下吧
#include "time.h"
int main()
{
int a,b,i;
a=time(0);
for(i=1;i<=100;i++)
{
a=a*214013+2531011;
b=a%10;
printf("%d ",b);
}
printf("\n");
}
怎么样,每次运行结果都不一样了吧。
当然有现成的函数来完成随机数功能,原理跟上面的代码查不多。请看下面的代码
#include
#include
int main()
{
int b,i;
srand(time(0));
for(i=1;i<=100;i++)
{
b=rand()%10;
printf("%d ",b);
}
printf("\n");
}
其中的 srand(time(0)); 是初始化随机种子。
rand()负责产生一个随机整数
说白了就是srand函数负责初始化一个变量,rand函数负责用一个运算规则改变这个变量的值。
你可以认为我们之前的代码中的a就是这个变量,srand函数相当于a=time(0);的作用rand函数相当于a=a*214013+2531011;的作用,只是其中的运算规则可能跟我写的不一样罢了。
当然srand函数和rand函数共同操作了一个变量,我们管这样的变量叫全局变量下节介绍吧。
另外我留2个练习
1、产生10个100~200之间的随机数你会不会
2、随机产生一注双色球号码
感兴趣的可以把代码发在评论里