C++中数组的累计和

Cumulative sum with array in C++

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <iomanip>
#include <sstream>
using namespace std;
  
int iData, tData;

void randgen(int max, int min){
  srand((unsigned) time(0));
}

int main()
{
  cout << "Masukkan jumlah data: ";
  cin >> iData;
  int jData[iData], randNum[iData], fProb[iData];
  double probkei[iData], tKumul[iData],tepiA[iData], tepiB[iData];
  int tData;


  for(int i=1; i<=iData; i++){
    cout << "Masukkan data ke-" << i << ": ";
    cin >> jData[i];
    tData += jData[i];            //jumlahkan seluruh data untuk mencari probabilitas tiap variabel
  }system("cls");

  probkei[0]=0;

  cout << setw(10) << "Data ke" << setw(10) << "Frekuensi" << setw(15) << "Probabilitas" << setw(20) << "Kumulatif" << setw(10) << "Interval" << endl;
  for(int i=0; i<iData; i++){
    probkei[i] = (double) jData[i]/tData;         //typecast integer to double for the probability
    if(jData[i]==jData[1]){
      tKumul[i] = probkei[i];
    }else if(i<i+i){
      tKumul[i] = probkei[i] + probkei[i+1];       //for cumulative sum 1 way
    }
    probkei[i] = round(probkei[i] * 1000.0) / 1000.0; //rounding the probability
    tKumul[i] = round(tKumul[i] * 1000.0) / 1000.0;
    cout << setw(10) << i+1 << setw(10) << jData[i] << setw(15) << probkei[i] << setw(20);
    int temp;
    cout<<"data "<<probkei[i]+probkei[i+1];        //for cumulative sum 2 way
    
    
    cout << setw(10) << tKumul[i] << endl;
    /*if (i == iData || jData[i] != jData[i - 1])
        {
            temp += count;
            cout << "Cumulative frequency of " << jData[i - 1] << " in the array is: " << temp << endl;
            count = 1;

        }else{
          count++;
        }*/
  }
  cout << setw(20) << "Total data: " << tData << endl;
 return 0;    
}

我想从我的阵列数据中计算累积频率。 首先是输入数组中数据数量的value/total。接下来是一个一个地输入每个数据的值,然后计算每个数据的所有概率(可能性以双精度声明)。然后计算累积数,即 n 个数据与 n+1 个数据的总和。最后是将每个数据的顶部和底部边缘用作随机数区间。 我已尽最大努力找到解决方案,但我仍然对为什么它不起作用感到困惑。 我试图用两种方式来计算它,但它们都什么都不做。 这是一个 Monte Carlo 模拟。

示例Table

这个:

int iData;
cin >> iData;
int jData[iData];

正在使用可变长度数组,这不是标准的 C++。而是使用 std::vector 代替:

int iData;
cin >> iData;
std::vector<int> jData(iData);

tData局部变量未初始化:

int tData;
...
tData += jData[i];

应该初始化为0。


条件 i<i+i 没有意义。

索引有些奇怪。输入从索引 1 加载,但第二个循环从 0 开始。从 1 加载也没有考虑数组的大小,因此最后一个元素将溢出数组。

这也有问题:

tKumul[i] = probkei[i] + probkei[i+1];

如果这应该是累计和那么tKumul也应该出现在右边。


如果我们从 0 加载数据,那么第二个循环应该是这样的:

for (int i = 0; i < iData; i++) {
    probkei[i] = (double) jData[i] / tData;
    if (i == 0) {
        tKumul[i] = probkei[i];
    } else {
        tKumul[i] = probkei[i] + tKumul[i-1];
    }

使用此代码 (see godbolt) 输出为:

   Data ke Frekuensi   Probabilitas           Kumulatif
         1         5          0.067               0.067
         2        10          0.133                 0.2
         3        15            0.2                 0.4
         4        20          0.267               0.667
         5        25          0.333                   1
        Total data: 75

此外,我建议使用 fixedsetprecision(3) 而不是手动舍入:

cout << fixed << setprecision(3);

并使用算法而不是循环。计算概率可以用std::transform代替,计算累计和可以用std::partial_sum代替:

std::transform(
        jData.begin(), jData.end(),
        probkei.begin(),
        [tData](auto elem) { return (double) elem / tData; }
);
std::partial_sum(probkei.begin(), probkei.end(), tKumul.begin());

使用此代码 (see godbolt) 输出为:

   Data ke Frekuensi   Probabilitas           Kumulatif
         1         5          0.067               0.067
         2        10          0.133               0.200
         3        15          0.200               0.400
         4        20          0.267               0.667
         5        25          0.333               1.000
        Total data: 75