• 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次左右,可见是比较均匀的。

  • 相关阅读:
    (四十九)Quartz2D自定义控件
    (四十八)Quartz2D引擎进阶
    (四十七)Quartz2D引擎初步
    (四十六)内存管理的复习
    (四十五)Modal 模态窗口 -遮盖
    (四十四)TabBarController和NagivationController配合
    (四十三)UITabBarController和AppDelegate的一些细节
    (四十二)tableView的滑动编辑和刷新 -局部刷新和删除刷新 -待解决问题
    linux命令——svn分支创建、合并
    C++异常处理
  • 原文地址:https://www.cnblogs.com/new0801/p/6177129.html
Copyright © 2020-2023  润新知