这学期的课程是前所未有过的紧张,前几天终于结课了!中间休息了两天,然后这两天又开始做课程设计了!
在休息的这两天,闲来无事做了个小程序,又在网上找了暑假实习生的职位,投了广州的CVT,做了一套专业题,虽然题目没做完,但是其中有一题让我很受益!先来说说我的那个小程序吧!我当时就想实现以下,N年前在文曲星上玩过的最简单的游戏猜数字!(呵呵,我知道这个程序,只要是个学过编程语言的都会。)那我就说点不一样的吧,先上代码:
/*本代码是:猜数字游戏(可多局玩)的源代码!*/
#include<stdio.h>
/*下面的rand()函数包含于头文件stdlib.h中*/
#include<stdlib.h>
#include<time.h>
main()
{
int a=0,b=0;
struct tm *newtime;
long ltime;
while(1)
{
printf("Hello, My friend,if you want to close this game,please input 'z'!\nIf you want to play this game,please input a char ,it isn't 'z'!\n");
if(getchar()=='z')
{
break;
}
else
{
time(<ime);
newtime=gmtime(<ime);
/*printf("%d",newtime->tm_sec);*/
/*上面的printf语句是为了输出当前系统时间中的秒数。*/
a=rand()%100+rand()%(newtime->tm_sec);
printf("Please guess the number(please input a interger number):\n");
scanf("%d",&b);
while(1)
{
if(a>b)
{
printf("Your number is low!Please input again:\n");
scanf("%d",&b);
}
else
if(a<b)
{
printf("Your number is high!Please input again:\n");
scanf("%d",&b);
}
else
if(a==b)
{
printf("OK!You are right!\n");
break;
}
}
getchar();
/*接受最后这个数,即正确数字输入后的回车符!*/
}
}
}
我第一次做的时候不是这样的,我当时仅仅用了rand()%100,这样以来程序虽然可以运行,但是太没意思了,因为每次猜的数字都一样,虽然第一次肯能要多次才能猜对,但是只要猜对后,下次猜时肯定还是这个数,只要记住这个数,除了第一次,以后每次猜时一次肯定能猜对。
这是因为rand()函数是个伪随机函数,即用这个函数产生的数都不是绝对的随机数,虽然现在我们没有办法产生绝对的随机数,但是我们有办法,产生一些改善的伪随机数,我当时就在想别人以前肯定也遇到过这类问题,网上肯定有解决办法,但是我还是想自己先动动脑子,如果实在做不出来,再去google或baidu吧!
最后,我还是想出了自己的方法,由于随机数的特性是没有规律变化的,rand()函数只是实现了一次没有规律的数,但是没有变化。我当时在想计算机中哪种东西是变化的呢?最后我想到了系统时间。于是我的想法是在rand()%100的基础上,在与(rand()%(当前系统时间的秒数))结合,这样就会产生相对效果好点的随机数了!具体实现见上面的代码吧!
本文是原创,转载请注明出处!