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
此外,我建议使用 fixed
和 setprecision(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
#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
此外,我建议使用 fixed
和 setprecision(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