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);
}
}
输出会类似。
我被分配了以下问题。编写一个程序,生成 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);
}
}
输出会类似。