7-27 样本方差
分数 15
作者 ldm
单位 成都信息工程大学
作为概率论随便考100分的你,口算出给定样本的方差自然也不在话下,不过今天需要你编程实现这样的程序。
样本方差:S2=n−11∑i=1n(X**i−Xˉ)2
样本均值:Xˉ=n1∑i=1nXi
输入格式:
输入共两行。
第一行为一个正整数n,(2≤n≤10000),即给定样本的数量。
第二行为n个整数,为每个样本的值。
输出格式:
输出仅 1 行,为计算出来的样本方差(保留 2 位小数,不足用 0 补齐)。
输入样例:
4
974 559 974 233
输出样例:
129074.00
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
代码
#include <bits/stdc++.h>
using namespace std;
// 计算均值
double averageNum(vector<int> numBag)
{
int sumNum = 0;
for (int num : numBag)
{
sumNum += num;
}
double avgNum = sumNum * 1.0 / numBag.size();
return avgNum;
}
// 计算方差
double sampleVariance(vector<int> numBag, double avgNum)
{
double tempSum = 0.0;
for (int tempNum : numBag)
{
// 计算平方的和
tempSum += pow(tempNum - avgNum, 2);
}
double sampVari = tempSum / (numBag.size() - 1);
return sampVari;
}
int main()
{
int n;
cin >> n;
vector<int> numBag;
// 输入数字
for (int i = 0; i < n; i++)
{
int tempNum;
cin >> tempNum;
numBag.push_back(tempNum);
}
// 计算样本均值
double avgNum = averageNum(numBag);
// 计算样本方差
double sampVari = sampleVariance(numBag, avgNum);
cout << fixed << setprecision(2) << sampVari << endl;
return 0;
}
优化代码
#include <bits/stdc++.h>
using namespace std;
// 计算均值
double averageNum(const vector<int>& numBag)
{
// return accumulate(numBag.begin(), numBag.end(), 0) *1.0/ numBag.size();
return accumulate(numBag.begin(), numBag.end(), 0.0) / numBag.size();
}
// 计算方差
double sampleVariance(vector<int> numBag, double avgNum)
{
double tempSum = 0.0;
for (int tempNum : numBag)
{
// 计算平方的和
tempSum += pow(tempNum - avgNum, 2);
}
double sampVari = tempSum / (numBag.size() - 1);
return sampVari;
}
int main()
{
int n;
cin >> n;
vector<int> numBag(n);
// 输入数字
for (int i = 0; i < n; i++)
{
cin >> numBag[i];
}
// 计算样本均值
double avgNum = averageNum(numBag);
// 计算样本方差
double sampVari = sampleVariance(numBag, avgNum);
cout << fixed << setprecision(2) << sampVari << endl;
return 0;
}
- 创建函数时,不会改变的值学会使用
const
传递,同时使用&避免不必要的复制,提升性能 - 使用
accumulate()
计算vector
中所有元素的和,初始值为0则为整数,初始值为0.0则最后为浮点数