c ++直方图随机数

c++ Histogram random numbers

我被分配了以下问题。编写一个程序,生成 0-99 范围内的 10000 个随机整数并生成直方图 来自随机数据。假设我们希望计算位于每个 intervals 0-9, 10-19, 20-29, ........., 90- 99。这需要我们保持10个计数,用一个数组来保持 10 次计数。虽然可以使用 if-else 语句检查值 x 位于哪个范围 这会很乏味。一个更好的方法是注意 x/10 returns 的索引的值 要递增的计数数组元素。 我有以下代码,但我不断收到 subscript requires array or pointer type 错误。

    #include<iostream>
using namespace std;

int main() {
    int count[10], i, nums[10000];

    // Create the Samples
    for (i = 0; i < 10000; i++){
        nums[i] = rand() % 100;


            //Actually displaying the histogram.
            cout << "0-9: ";
            for (i = 0; i < nums[0][1] / 20; i++) { cout << "X"; }
        cout << endl;

            cout << "10-19: ";
        for (i = 0; i < nums[1][1] / 20; i++) { cout << "X"; }
        cout << endl;

        cout << "20-29: ";
        for (i = 0; i < nums[2][1] / 20; i++) { cout << "X"; }
        cout << endl;

        cout << "30-39: ";
        for (i = 0; i < nums[3][1] / 20; i++) { cout << "X"; }
        cout << endl;

        cout << "40-49: ";
        for (i = 0; i < nums[4][1] / 20; i++) { cout << "X"; }
        cout << endl;

        cout << "50-59: ";
        for (i = 0; i < nums[5][1] / 20; i++) { cout << "X"; }
        cout << endl;

        cout << "60-69: ";
        for (i = 0; i < nums[6][1] / 20; i++) { cout << "X"; }
        cout << endl;

        cout << "70-79: ";
        for (i = 0; i < nums[7][1] / 20; i++) { cout << "X"; }
        cout << endl;

        cout << "80-89: ";
        for (i = 0; i < nums[8][1] / 20; i++) { cout << "X"; }
        cout << endl;

        cout << "90-99: ";
        for (i = 0; i < nums[9][1] / 20; i++) { cout << "X"; }
        cout << endl;
    }
    }


您对 nums 的使用是不正确的,最终您并不真正关心保留这些值。您所关心的只是它们发生了;不是他们事后的样子。

收集 0..99 中特定范围的数据,分成 10 个部分(0..9、10..19、20..29 等)可以通过以下方式轻松完成:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>

int main()
{
    int count[10] = {0};

    std::srand((unsigned)std::time(nullptr));

    for (int i=0; i<10000; ++i)
        ++count[(rand() % 100) / 10];

    for (int i=0; i<10; ++i)
    {
        std::cout 
            << std::setw(2)
            << std::setfill('0')
            << std::setprecision(2)
            << i * 10
            << '-'
            << std::setw(2)
            << (i+1) * 10 - 1
            << " : ";

        for (int j=0; j<count[i]/20; ++j)
            std::cout << '*';
        std::cout.put('\n');
    }     
}

输出(显然会有所不同)

00-09 : ***************************************************
10-19 : *************************************************
20-29 : **************************************************
30-39 : **************************************************
40-49 : *****************************************************
50-59 : ************************************************
60-69 : ************************************************
70-79 : ************************************************
80-89 : ***************************************************
90-99 : ************************************************

C 版(哎呀)

我误读了这个问题,并认为你的目标是 C(主要是因为随着 <random> 的出现,在现代 C++ 程序中没有任何头脑正常的人使用 rand())。凡事不枉此行,见下文。

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

int main()
{
    int count[10] = {0};

    srand((unsigned)time(NULL));
    for (int i=0; i<10000; ++i)
        ++count[(rand() % 100) / 10];

    for (int i=0; i<10; ++i)
    {
        printf("%02d-%02d : ", i*10, (i+1)*10-1);
        for (int j=0; j< count[i] / 20; ++j)
            fputc('*', stdout);
        fputc('\n', stdout);
    }     
}

输出会类似。