题目要求
步骤1:首先生成一个总体(约10000个数据),计算出总体的均值与方差,
步骤2:指定一个自然数n(n可分别取2,3,5,15,25,30.。。。)
步骤3:从总体中抽取n个数据组成一个样本,计算出样本的均值
步骤4:重复步骤3 m次(例如:m=1000),
步骤5:计算m个样本均值的平均值和方差
步骤6:验证m个样本均值的平均值和方差与总体的均值、方差的数理关系
步骤7:重复步骤2到步骤6的过程,n取不同的对应值
步骤8:生成不一样的总体数据,重复步骤1到步骤7的过程
实验结果截图:
代码解析:
包含的头文件
cpp
#include <iostream> | |
#include <vector> | |
#include <set> | |
#include <ctime> | |
#include <cstdlib> |
- <iostream>: 用于输入输出流操作。
- <vector>: 用于使用动态数组。
- <set>: 虽然在这段代码中最终没有直接使用set,但原本的代码中有用到,这里仍然包含以防后续修改。
- <ctime>: 用于获取当前时间,以设置随机数种子。
- <cstdlib>: 提供rand()和srand()函数,用于生成随机数。
命名空间
cpp
using namespace std; |
- 使用std命名空间,这样在代码中就可以不用前缀std::来调用标准库中的类和函数。
函数定义
calculateVariance
cpp
double calculateVariance(double mean, const vector<int>& num, int n) { | |
double variance = 0; | |
for (int i = 0; i < n; ++i) { | |
variance += (num[i] - mean) * (num[i] - mean); | |
} | |
return variance / n; | |
} |
- 此函数用于计算方差。它接受平均值mean、整数向量num和元素数量n作为参数。
- 遍历向量中的每个元素,计算每个元素与平均值的差的平方,并累加到variance变量中。
- 最后返回方差(即差的平方的平均值)。
calculateMean
cpp
double calculateMean(const vector<int>& num, int n) { | |
double sum = 0; | |
for (int i = 0; i < n; ++i) { | |
sum += num[i]; | |
} | |
return sum / n; | |
} |
- 此函数用于计算平均值。它接受整数向量num和元素数量n作为参数。
- 遍历向量中的每个元素,并将它们累加到sum变量中。
- 最后返回平均值(即总和除以元素数量)。
getRandomSubset
cpp
vector<int> getRandomSubset(const vector<int>& num, int n) { | |
vector<bool> used(num.size(), false); | |
vector<int> subset; | |
while (subset.size() < n) { | |
int index = rand() % num.size(); | |
if (!used[index]) { | |
used[index] = true; | |
subset.push_back(num[index]); | |
} | |
} | |
return subset; | |
} |
- 此函数用于从给定的整数向量num中随机抽取n个不重复的元素,并返回这些元素组成的子集。
- 使用一个布尔向量used来跟踪哪些元素已经被抽取过。
- 在循环中,生成一个随机索引,检查对应的元素是否已经被抽取过,如果没有,则将其标记为已抽取并添加到子集subset中。
- 当子集的大小达到n时,循环结束,并返回子集。
main 函数
初始化
cpp
srand(time(nullptr)); // 设置随机数种子为当前时间 |
- 设置随机数种子为当前时间,以确保每次程序运行时生成的随机数序列不同。
生成初始数据
cpp
vector<int> num(10000); | |
for (int i = 0; i < 10000; ++i) { | |
num[i] = rand() % 100; | |
} |
- 创建一个大小为10000的整数向量num,并用0到99之间的随机数填充它。
计算初始平均值和方差
cpp
double mean = calculateMean(num, 10000); | |
double variance = calculateVariance(mean, num, 10000); | |
cout << "Initial mean and variance: " << mean << " " << variance << endl; |
- 使用calculateMean和calculateVariance函数计算向量num的平均值和方差,并打印结果。
读取实验次数和每次实验的抽取数量
cpp
int m; | |
cin >> m; | |
for (int i = 0; i < m; ++i) { | |
int n; | |
cin >> n; | |
// ... (实验逻辑) | |
} |
- 从标准输入读取实验次数m。
从标准输入读取每次实验需要抽取的元素数量n。
执行实验并打印结果
cpp复制代码
for (int i = 0; i < m; ++i) { | |
int n; | |
cin >> n; | |
vector<int> subset = getRandomSubset(num, n); | |
double subsetMean = calculateMean(subset, n); | |
double subsetVariance = calculateVariance(subsetMean, subset, n); | |
cout << "Subset mean and variance: " << subsetMean << " " << subsetVariance << endl; | |
} |
- 对于每次实验,调用getRandomSubset函数从num中随机抽取n个元素,并计算该子集的平均值和方差。
- 打印出子集的平均值和方差。
代码截图:
完整代码:
#include <iostream>
#include <vector>
#include <set>
#include <ctime> // 引入时间库用于设置随机数种子
#include <cstdlib> // 引入cstdlib库用于使用rand()和srand()函数
using namespace std;
double calculateVariance(double mean, const vector<int>& num, int n) {
double variance = 0;
for (int i = 0; i < n; ++i) {
variance += (num[i] - mean) * (num[i] - mean);
}
return variance / n;
}
double calculateMean(const vector<int>& num, int n) {
double sum = 0;
for (int i = 0; i < n; ++i) {
sum += num[i];
}
return sum / n;
}
vector<int> getRandomSubset(const vector<int>& num, int n) {
vector<bool> used(num.size(), false); // 标记哪些数已经被抽取过
vector<int> subset;
while (subset.size() < n) {
int index = rand() % num.size();
if (!used[index]) {
used[index] = true;
subset.push_back(num[index]);
}
}
return subset;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
srand(time(nullptr)); // 设置随机数种子为当前时间
vector<int> num(10000);
for (int i = 0; i < 10000; ++i) {
num[i] = rand() % 100;
}
double mean = calculateMean(num, 10000);
double variance = calculateVariance(mean, num, 10000);
cout << "Initial mean and variance: " << mean << " " << variance << endl;
int m;
cin >> m;
for (int i = 0; i < m; ++i) {
int n;
cin >> n;
vector<int> subset = getRandomSubset(num, n);
double subsetMean = calculateMean(subset, n);
double subsetVariance = calculateVariance(subsetMean, subset, n);
cout << "Examination " << i + 1 << ", result is (mean, variance): (" << subsetMean << " " << subsetVariance << ")" << endl;
}
cout << "END" << endl;
return 0;
}