目录
前言
如何用C语言实现随机数
随机数原理
rand函数(生成随机数)
srand(避免每次运行程序产生的随机数都相同)
时间戳
time函数
来个小小项目
代码实现
1.漂亮的主页
2.游戏开关
3.game()函数的代码实现。
4.完整代码
手把手教你得到计算机的随机数,并附上一个小栗子。
这两天时间允许还是日更叭,落下了不少博客没写呢,元气满满的一天,加油!多谢大家的支持,我已经500粉啦!
计算机所产生的随机数是通过一串很长的序列数模拟随机数,故称为伪随机数,在实际应用这些随机数时,这些随机数一般都能具有真实随机数的所有概率性质和统计性质,因此可以产生许许多多的序列伪随机数,一个序列的第一个随机数对应一个数,这个数称为种子数(seed)。
简单的说,计算机随机数是通过一个算法(我也不知道)在一串已经定下来的数据中生成,每次生成随机数的起点叫做“种子数”。这个了解一下就行。
在获取随机数的时候我们需要用到rand函数,拿出我们祖传的网站:http://cplusplus.com/ 来了解这rand函数。
这是一个针对函数资料查找的一个网站,在搜索栏写入你想查看的函数就可以的出结果。界面是全英文,在刚开始我们可以用百度翻译来帮助我们,看多了你就会发现,凭自己的能力也能看的懂了。不推荐使用整页翻译,这样会把int,rand,void等等关键词翻译掉,反而不利于我们理解。
我们来一点一点理解(其实我也是用了百度翻译)。
可以得出,我们无需传数据进去,且它会返回一个整数。
并且它返回的是一个0到RAND_MAX间的数字。而RAND_MAX的值具体是多大,我们可以医用编译器来看看。和RAND_MAX一样,调用rand也需要声明stdlib头文件。
十六进制0x7fff换算成十进制就是32767。函数给我们的返回值就是0~32767这范围的一个随机数。
通过代码简单试一试,rand函数的效果。
第一次:
但当我们运行第二次的时候,我们会发现,他返回的数字一模一样。
如果要求不是很高的话,这样子使用rand函数已经够了。但有一说一,这其实并不是真正的随机数。包括你重启电脑再去运行的话它还是会返回一模一样的结果,因为我们的种子数没有改变。
srand()用于初始化rand()使用的随机数种子
我们在代码中加上srand试一试
换一个种子数试试:
我们可以看出,随着种子数的不同系统产生的随机数也是不同的。如果我的种子数是时刻改变的,那我这个程序不是就可以每时每刻都生成不同的数字了。这取决于种子数在每时每刻都不一样,什么样的东西满足我们这个要求呢——时间。
简单的说,时间戳就是随时间改变而改变的一个整数。比如下面两个例子:
每时每刻都生成不同的数字。要想实现这个目的,只需要将时间戳放入rand函数里去。这里可以用time函数来实现
从这个图可得,使用这个函数需要传入一个指针变量,它会返回一个time_t类型的元素,这个元素也是随时间戳改变而改变的。
PS:time函数需要调用time.h头文件。
我们可以看到,两次使用这个程序,它给我们带来的数字是完全不一样的。这样就实现了随机数的取值。
这次我们来学习一个小项目的制作,猜数字,规则如下:
在1~100的范围内猜数字n(假如是80),我第一次猜50,被提示小了;第二次猜75,提示小了;第三次猜87,提示大了;第四次猜80,猜对了。
项目思路:
这个游戏思路不难,而且我们刚好可以联系一下随机数这个概念。一起来吧。
在制作一个游戏时,我们需要一个漂亮的主页,我们把它集成到一个函数中实现。
void menu()
{
printf("*********************\n");
printf("***** 1.开始游戏 ****\n");
printf("***** 0.退出游戏 ****\n");
printf("*********************\n");
}
实现效果:
接下来我们需要一个实现一个控制游戏开关的代码段。为了我建议用到do while循环,因为它的特点就是:不管三七二十一,先循环一遍。这里我们的程序至少要循环一遍,看看玩家是否继续游戏。
int main()
{
int op=0;
do
{
menu();
printf("请输入你的选项:");
scanf("%d",&op);
switch (op)
{
case 1:printf("开始游戏\n");
break;
case 0:printf("退出游戏");
break;
default:printf("输入错误,请再次输入\n");
break;
}
} while (op);
return 0;
}
这就是运行效果,嗯嗯达到我们的预期了。
这里有一个小细节,有些小伙伴可能已经注意到了。每写一部分,我就会测试一部分,这是一个编程的小技巧,这样可以有效避免bug的累加,因为bug累计多了,到最后测试的时候你会发现无从下手。
不过这样子也能让博客讲的更清楚,真好。
接下来进行主要部分的书写。
void game()
{
int ret=rand()%100+1;//实现程序取得的随机数值为1~100
int guess=0;
do
{
scanf("%d", &guess);
if (guess < ret)
printf("猜小了\n");
else if (guess > ret)
printf("猜大了\n");
else
{
printf("猜对了\n");
break;
}
} while (1);//猜对了才能退出
return;
}
第三行这里给程序产生的随机数取mod了,目的在于实现取得的随机数在1~100的范围之内。
同理,如果你想取50~100,可以这样写:
ret = rand () % 50 + 51;
#include
#include
#include
void menu()
{
printf("**********************\n");
printf("***** 1.开始游戏 ****\n");
printf("***** 0.退出游戏 ****\n");
printf("**********************\n");
}
void game()
{
int ret=rand()%100+1;
int guess=0;
do
{
scanf("%d", &guess);
if (guess < ret)
printf("猜小了\n");
else if (guess > ret)
printf("猜大了\n");
else
{
printf("猜对了\n");
break;
}
} while (1);//猜对了才能退出
return;
}
int main()
{
srand((unsigned int)time(NULL));
int op=0;
do
{
menu();
printf("请输入你的选项:");
scanf("%d",&op);
switch (op)
{
case 1:printf("开始游戏\n");
game();
break;
case 0:printf("退出游戏");
break;
default:printf("输入错误,请再次输入\n");
break;
}
} while (op);
return 0;
}
一个小细节,因为srand函数实质上是对种子数的初始化,我们习惯性将它放在主函数来初始化,而且一个工程只需要定义一次就行了。
到这里这篇文章就算结束了
尼尔叔叔:你自己去试试看吧。
有个思路很类似的文章二分查找法
也可以学习一下。