VC绘图/游戏简易教程--11:随机函数
作者:BestAns

教程总目录:http://www.easyx.cn/skills/View.aspx?id=45 (里面包括VC下的graphics.h的配置方法)

[随机函数简介]
游戏中,许多情况都是随即发生的。还有一些图案程序,例如屏保,也是随即运动的。这就需要用随机函数。

随机函数很简单,只有一个:
rand()
该函数返回 0~32767 之间的一个整数。(不需要记住 32767 这个数字,大概知道这个范围就行了)
该函数在头文件 <stdlib.h> 中,使用前记得引用。

 

[简单测试]
来写个程序测试一下:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int r;
    for(int i=0; i<10; i++)
    {
        r = rand();
        printf("%d\n", r);
    }
}

执行后,可以看到输出了 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>

void 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();
}

 

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

更新时间:2010/5/28