第二次实验 验证中心极限定理
实验过程:
步骤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的过程
#include <iostream>
#include "vector"
#include "set"
using namespace std;
double getz(double a,vector<int> &num,int n)
{
double z=0;
for(int i=0;i<n;++i)
{
z+=(num[i]-a)*(num[i]-a);
}
return z/n;
}
double geta(vector<int> &num,int n)
{
double a=0;
for(int i=0;i<n;++i)
{
num[i]=rand()%100;
a+=num[i];
}
return a/n;
}
int main() {
//加速cin
ios::sync_with_stdio(0);
cin.tie(0);
double aver=0;
double z=0;
vector<int> num(10000,0);
//生成10000个数据,并计算方差和均值
for(int i=0;i<10000;++i)
{
num[i]=rand()%100;
aver+=num[i];
}
aver/=10000;
z= getz(aver,num,10000);
printf("This is the result:");
cout<<z<<" "<<aver<<endl;
int m;//实验的次数
cin>>m;
for(int i=0;i<m;++i)
{
cout<<"input n"<<endl;
int n,j=0,pos;//n为要取出的元素的个数
set<int> st;//用于判断是否取出过那个数
cin>>n;
pos=n;
vector<int> ex(n,0);
while (n!=0)
{
int k=rand()%10000;
if(st.find(k)!=st.end())
{
continue;
}
else
{
st.insert(k);
ex[j++]=num[k];
n--;
}
}
double a;
a=geta(ex,pos);
double z;
z=getz(a,ex,pos);
cout<<"This is the "<<i+1<<" examination,the result is(avervage,variance): ( "<<a<<" "<<z<<" )"<<endl;
}
cout << "END" << endl;
return 0;
}