我自己已经这样做了大约两个月,这是我自己编写的第一个独立程序。它对随机变量的行为进行建模。它绘制 SIZEA 个 1 到 100 之间的随机值,然后将它们输入到数组中并计算平均值和标准差。该随机实验可以重复 SIZEB 次。所有重复实验的平均值再次输入数组并用于计算平均值和标准误差的期望值。最后,将每个单独实验的值和每个实验的平均值进行分箱(箱大小分别为 10 和 5),然后用于计算频率和直方图。为了对值进行分类,我使用了嵌套的 IF ELSE 语句,生成了相对大量的代码行。我想知道是否有人可以想出一个更优雅的解决方案来对这些值进行分箱?
这里的代码分箱位于第 27 至 74 行和第 99 至 200 行。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//define system constants
#define SIZEA 100
#define SIZEB 300
//i, j, n are indices
int
main(void)
{
size_t i = 0;
int A[SIZEA];
float B[SIZEB];
int C[SIZEB];
srand(time(NULL));
// outer loop for SIZEB number of individual sampling events
while (i < SIZEB) {
printf("\n");
size_t j = 0;
int FREQUENCY[10] = { 0 };
// inner loop for SIZEA number of drawings constituting each sampling
// event
while (j < SIZEA) {
int grade = rand() % 100 + 1;
A[j] = grade;
printf("%3d\n", A[j]);
// bin values of each sampling event
if (A[j] > 0 && A[j] <= 10) {
++FREQUENCY[0];
}
else {
if (A[j] > 10 && A[j] <= 20) {
++FREQUENCY[1];
}
else {
if (A[j] > 20 && A[j] <= 30) {
++FREQUENCY[2];
}
else {
if (A[j] > 30 && A[j] <= 40) {
++FREQUENCY[3];
}
else {
if (A[j] > 40 && A[j] <= 50) {
++FREQUENCY[4];
}
else {
if (A[j] > 50 && A[j] <= 60) {
++FREQUENCY[5];
}
else {
if (A[j] > 60 && A[j] <= 70) {
++FREQUENCY[6];
}
else {
if (A[j] > 70 && A[j] <= 80) {
++FREQUENCY[7];
}
else {
if (A[j] > 80 && A[j] <= 90) {
++FREQUENCY[8];
}
else {
if (A[j] > 90 && A[j] <= 100) {
++FREQUENCY[9];
}
}
}
}
}
}
}
}
}
}
++j;
// inner loop end
}
for (size_t n = 0; n < 10; ++n) {
printf("\n%3d", FREQUENCY[n]);
}
int sum = 0;
for (j = 0; j < SIZEA; ++j) {
sum += A[j];
}
printf("\n");
float mean = (float) sum / SIZEA;
printf("\nMean of Array values is: %1f\n", mean);
int sumsq = 0;
for (j = 0; j < SIZEA; ++j) {
sumsq = sumsq + pow((A[j] - mean), 2);
}
printf("Sum of squares is: %1d\n", sumsq);
int stdev;
stdev = sqrt(sumsq / SIZEA);
printf("STDEV is: %1d\n", stdev);
B[i] = mean;
C[i] = stdev;
++i;
// outer loop end
}
int FREQUENCYMEAN[20] = { 0 };
// bin mean values of sampling events
for (i = 0; i < SIZEB; ++i) {
if (B[i] > 0 && B[i] <= 5) {
++FREQUENCYMEAN[0];
}
else {
if (B[i] > 5 && B[i] <= 10) {
++FREQUENCYMEAN[1];
}
else {
if (B[i] > 10 && B[i] <= 15) {
++FREQUENCYMEAN[2];
}
else {
if (B[i] > 15 && B[i] <= 20) {
++FREQUENCYMEAN[3];
}
else {
if (B[i] > 20 && B[i] <= 25) {
++FREQUENCYMEAN[4];
}
else {
if (B[i] > 25 && B[i] <= 30) {
++FREQUENCYMEAN[5];
}
else {
if (B[i] > 30 && B[i] <= 35) {
++FREQUENCYMEAN[6];
}
else {
if (B[i] > 35 && B[i] <= 40) {
++FREQUENCYMEAN[7];
}
else {
if (B[i] > 40 && B[i] <= 45) {
++FREQUENCYMEAN[8];
}
else {
if (B[i] > 45 && B[i] <= 50) {
++FREQUENCYMEAN[9];
}
else {
if (B[i] > 50 && B[i] <= 55) {
++FREQUENCYMEAN[10];
}
else {
if (B[i] > 55 && B[i] <= 60) {
++FREQUENCYMEAN[11];
}
else {
if (B[i] > 60 && B[i] <= 65) {
++FREQUENCYMEAN[12];
}
else {
if (B[i] > 65 && B[i] <= 70) {
++FREQUENCYMEAN[13];
}
else {
if (B[i] > 70 && B[i] <= 75) {
++FREQUENCYMEAN[14];
}
else {
if (B[i] > 75 && B[i] <= 80) {
++FREQUENCYMEAN[15];
}
else {
if (B[i] > 80 && B[i] <= 85) {
++FREQUENCYMEAN[16];
}
else {
if (B[i] > 85 && B[i] <= 90) {
++FREQUENCYMEAN[17];
}
else {
if (B[i] > 90 && B[i] <= 95) {
++FREQUENCYMEAN[18];
}
else {
if (B[i] > 95 && B[i] <= 100) {
++FREQUENCYMEAN[19];
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
printf("\n");
int sumE = 0;
for (i = 0; i < SIZEB; ++i) {
printf("Mean %1d: %1f\n", i, B[i]);
sumE = sumE + B[i];
printf("STDEV %1d: %1d\n", i, C[i]);
}
float expectvalue = (float) sumE / SIZEB;
printf("\nExpect value of mean is: %1f", expectvalue);
int sumsqE = 0;
for (i = 0; i < SIZEB; ++i) {
sumsqE = sumsqE + pow((B[i] - expectvalue), 2);
}
int SE;
SE = sqrt(sumsqE / SIZEB);
printf("\nSE of Mean is: %1d", SE);
printf("\n");
printf("\nFrequency of Expect value of mean:");
printf("\n%5s%11s%11s", "Bin", "Frequency", "Histogram");
for (size_t k = 0; k < 20; ++k) {
printf("\n%4d%9d ", k, FREQUENCYMEAN[k]);
for (size_t n = 1; n <= FREQUENCYMEAN[k]; ++n) {
printf("%c", '.');
}
puts("");
}
}
您可以通过将数字除以垃圾箱的大小来找到该数字所在的垃圾箱
int bin = (A[j] - 1)/ 10;
++FREQUENCY[bin];
int bin = (B[i] - 1) / 5;
++FREQUENCYMEAN[bin];