VC绘图/游戏简易教程--8:随机函数
教程总目录:https://codebus.cn/bestans/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)
随机函数
函数简介
游戏中,许多情况都是随即发生的。还有一些图案程序,例如屏保,也是随即运动的。这就需要用随机函数。
随机函数很简单,只有一个:
rand()
该函数返回 0~32767 之间的一个整数。(不需要记住 32767 这个数字,大概知道这个范围就行了)
该函数在头文件 <stdlib.h> 中声明,使用前记得引用。
简单测试
#include <stdio.h>
#include <stdlib.h>
int main()
{
int r;
for(int i=0; i<10; i++)
{
r = rand();
printf("%d\n", r);
}
return 0;
}
执行后,可以看到输出了 10 个随机数字。
指定范围的随机函数
实际中,我们经常要产生指定范围的随机函数,通常我们用求余数的办法。例如,产生 0~9 之间的随机数,只需要将任意产生的随机数除以 10 求余数即可。求余数的运算符号是 %,可以这样做:
r = rand() % 10;
修改前面的测试程序执行后可以看到,产生的数字都是小于 10 的。
如果是 1~6 之间的怎样求呢?
r = rand() % 6 + 1;
无论产生什么样范围的随机函数,都是通过各种运算将随机数的范围 [0, 32767] 修改为自己需要的范围。
随机种子
做了多次试验,我们会发现一个问题:虽然产生的数字是随机的,但每次产生的数字序列都一样。为了解决这个问题,我们需要用“随机种子”。
随机函数的产生原理简单来说,就是:前一个随机函数的值,决定下一个随机函数的值。
根据这个原理我们可以知道:只要第一个随机函数的值确定了,那么后面数字序列就是确定的。如果想得到不同的数字序列,就需要确定第一个随机函数的值,对于设置第一个随机函数的值,叫做设置“随机种子”。容易理解,随机种子设置一次即可。
设置随机种子的函数如下:
srand(种子);
通常,我们用当前时间来做随机种子:
srand( (unsigned)time( NULL ) );
因为使用 time 函数,所以记得引用 <time.h>。
绘图中的应用
来一个简单的程序,在屏幕上任意位置画任意颜色的点(按任意键退出):
#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
int main()
{
srand( (unsigned)time( NULL ) );
initgraph(640, 480);
int x, y, c;
while(!_kbhit())
{
x = rand() % 640;
y = rand() % 480;
c = RGB(rand() % 256, rand() % 256, rand() % 256);
putpixel(x, y, c);
}
closegraph();
return 0;
}
作业
- 回顾一下第 6 课“实现简单动画”的作业:绘制一个沿 45 度移动的球,碰到窗口边界后反弹。
将这个球改为沿任意角度移动的球,碰到边界后以任意角度反弹。