C语言入门(17)——C语言数组应用的一个实例

本篇通过一个实例介绍使用数组的一些基本模式。问题是这样的:首先生成一列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次左右,可见是比较均匀的。

原文地址:https://www.cnblogs.com/new0801/p/6177129.html