BestAns

路漫漫其修远兮,吾将上下而求索

VC绘图/游戏简易教程--8:随机函数

教程总目录:https://www.codeabc.cn/bestans/post/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;
}

[作业]

1. 回顾一下第 6 课“实现简单动画”的作业:绘制一个沿 45 度移动的球,碰到窗口边界后反弹。
将这个球改为沿任意角度移动的球,碰到边界后以任意角度反弹。

分享到