在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 和srand()函数来生成随机数,如果要保证每次产生的随机数不重复,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。
利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的,下面我们就动手用srand()函数来产生随机数吧。
(1)先试试如何产生随机数(比如产生10个100以内的随机数)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<math.h>
int main(void)
{
srand(time(NULL));//先种种子
int i,j,s=0;
FILE *fp = NULL;
for(i = 0 ; i < 10 ; i ++) //产生10个100以内的随机数
{
j = rand()%100 ;
printf("j:%d\n",j);
}
return 0;
}
(2)将产生的随机数写入文件中(以.text文件为例)
fp = fopen("D:\\Users\\data.txt","a");//在指定目录下创建.txt文件
fprintf(fp,"%5d",j); //把随机数写进文件
fclose(fp); //关闭文件
可以看见在自定义文件夹中已经产生了一个data文件,打开后里面已经产生10个100以内的随机数。(可能有人看到图片会发出疑问为什么data文件里的随机数和命令窗口里显示的不同,因为添加写入文件的代码后重新生成了随机数。)
(3)在编写博客过程中,脑袋像戏精一样突发奇想:假如不看文件夹我怎么通过命令窗口知道data文件是否生成了呢,万一它骗我呢??
if((fp=fopen("D:\\Users\\data.txt","w"))==NULL)
{
printf("can not creat the file\n");
exit(0);
}
printf("creat the file successful\n");
(4)想要点击发布博客时突然又想自己能不能通过命令窗口控制随机数的范围和个数??(通过查阅相关资料修改代码,i 表示随机数的范围2^i ,考虑到电脑是64位的,理论上 i 不超过64,M 表示随机数的个数)
int i,M,b,s=0,j,max;
FILE *fp;//声明文件指针
char str[]="";
scanf("%d%d",&i,&M); //输入i,M
fp = fopen("D:\\Users\\data.txt","a");//在指定目录下创建.txt文件
fprintf(fp,"i= %d\nM= %d\n",i,M); //第一行显示i=的大小,第二行显示M=的大小
srand(time(NULL)); //初始化时间种子
max=(int)pow(2,i); //随机数的最大值
for(j=0;j<M;j++)
{
b=rand()%(max/M)+1; //区间
fprintf(fp,"%-5d ",b); //把随机数写进文件
if(j%10==9)fprintf(fp,"\n"); //换行
}
fclose(fp); //关闭文件
return 0;
(5)通过上面的代码成功实现了自己控制随机数的范围和个数,但是打开data文件发现新的随机数不断写入data文件,随机数一多会造成比较乱,自己想能不能通过修改代码产生不同的文件然后让随机数分别写入不同文件中,并且产生的文件比较容易区分??
scanf("%d%d",&i,&M); //输入i,M
sprintf(str,"test_%d_%d.txt",i,M); //把i,M写进文件名
fp=fopen(str,"w"); //以写方式新建一个文件
这样通过文件夹的名称我们可以一眼就看的出来哪个文件夹放着的随机数范围和个数分别是多小,这样就特别方便我们找到自己想要的随机数。
(6)这样看起来感觉还行,但是脑袋一热又想:如果产生的随机数比较多,我怎么快速分辨它们的大小呢??(嗯。。。那就给随机数按大小排一下序吧)
b=rand()%(max/M)+1; //区间
s=s+b; //确保随机数是从小到大
printf("s:%d\n");
fprintf(fp,"%-5d ",s); //把随机数写进文件
总结:对于编程,一定要学会自己动手,只看理论知识是很难学会编程的,就拿C语言产生随机数并且写入文件上来说,刚开始只产生随机数的代码只有简单的几行,在编程过程中可以发现和脑补很多东西,通过不断发现和拓展新功能,增加和补充代码,代码变成了三十多行,如果突然拿三四十行的代码给你看,可能你需要花费一定时间才能看懂,但是如果你根据功能把它分开成一小部分,你理解起来会容易得多。编程也是一样的,通过自己一段一段的去写,最后汇总起来就变成一个程序。