【scau统计学】c++实验二验证中心极限定理

本文介绍了一个编程实验,通过生成随机数总体并抽取不同数量的样本,计算样本均值和方差,验证其与总体均值和方差的关系。代码展示了如何使用C++实现这一过程,包括计算平均值、方差以及从总体中随机抽取子集的功能。
摘要由CSDN通过智能技术生成

题目要求

步骤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的过程

实验结果截图:

dbd32b70ae5a4b9395c5b5d5d2b6f07d.png

代码解析:

包含的头文件

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个元素,并计算该子集的平均值和方差。
  • 打印出子集的平均值和方差。

代码截图:

8208461182ef4f778811c3067384203a.png

完整代码:

#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;
}

 

 

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值