本篇通过一个实例介绍使用数组的一些基本模式。问题是这样的:首先生成一列0-9的随机数保存在数组中,然后统计其中每个数字出现的次数并打印,检查这些数字的随机性如何。随机数在某些场合(例如游戏程序)中是非常有用的,但是用计算机生成完全随机的数却不是那么容易的。计算机执行每一条指令的结果都是确定的,没有一条指令产生的是随机数,调用C标准库得到的随机数其实是伪随机(Pseudorandom)数,是用数学公式算出来的确定的数,只不过这些数看起来很随机,并且从统计意义上也很接近均匀分布(Uniform Distribution)的随机数。
C标准库中生成伪随机数的是rand函数,使用这个函数需要包含头文件stdlib.h,它没有参数,返回值是一个介于0和RAND_MAX之间的接近均匀分布的整数。RAND_MAX是头文件中定义的一个常量,在不同的平台上有不同的取值,但可以肯定它是一个非常大的整数。通常我们用到的随机数是限定在某个范围之中的,例如0~9,而不是0~RAND_MAX,我们可以用%运算符将rand函数的返回值处理一下:
int x = rand() % 10;
使用随机数的例子,为了便于分析和调试,我们取小一点的数组长度,只生成20个随机数:
#include <stdio.h> #include <stdlib.h> #define N20 int a[N]; void gen_random(intupper_bound) { inti; for(i = 0; i < N; i++) a[i] =rand() % upper_bound; } void print_random() { inti; for(i = 0; i < N; i++) printf("%d ", a[i]); printf(" "); } int main(void) { gen_random(10); print_random(); system("pause"); return0; }
运行结果:
上面的输出结果看起来很随机了。但随机性如何呢?分布得是否均匀?所谓均匀分布,应该每个数出现的概率是一样的。在上面的20个结果中,6出现了5次,而4和8一次也没出现过。但这说明不了什么问题,毕竟我们的样本太小了,才20个数,如果样本足够大,比如说100000个数,统计一下其中每个数出现的次数也许能说明问题。但是总不能把100000个数都打印出来然后挨个去数吧?我们需要写一个函数统计每个数字出现的次数。完整的程序如下:
#include <stdio.h> #include <stdlib.h> #define N100000 int a[N]; void gen_random(intupper_bound) { inti; for(i = 0; i < N; i++) a[i] =rand() % upper_bound; } int howmany(intvalue) { intcount = 0, i; for(i = 0; i < N; i++) if(a[i] == value) ++count; returncount; } int main(void) { inti; gen_random(10); printf("value how many "); for(i = 0; i < 10; i++) { printf("%d %d ", i, howmany(i)); } system("pause"); return0; }
运行结果:
可以看出从0到9各数字出现的次数都在10000次左右,可见是比较均匀的。