[問題] 想請問一個問題 有關POISSON分配抽值 먠…
(1)poisson(10)抽100萬筆 計算樣本平均數 (跟母體期望值10 差距很小 差距是用手算的)
以上重複做了5次 每次差距小於0.01或者0.001以下
(2)poisson(100)抽100萬筆 計算樣本平均數 (母體期望值100)
重複作5次 但是每次差距有0.1到0.2
照理說樣本數夠多 樣本平均數應該很靠近母體期望值 但是感覺2怪怪的(1就不錯)
可以看看 是哪邊出問題嗎?
(3)剛剛又跑了一次從 poison(1000)抽出500萬筆
樣本平均數998.XXX 樣本變異數10530.XXX (母體E[X]=1000 Var(X)=1000)
有很大的差距 樣本變異數完全走樣= ="
(4)跑抽樣個數500萬 分配參數10 結果:樣本平均數9.999791 變異數10.009554
同樣4比3好很多(指跟母體期望值 變異數的差距)
------------------------------------------------
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<string>
#include<unistd.h>
using namespace std;
vector<double> rand_poi( const int &N,const double &lambda);
int main(){
int n,d;
double a,b,sum=0,std=0;
clock_t T1, T2;
cout<<"選擇分配:"<<endl;
cout<<"(5)poisson "<<endl;
cin>>d;
cout<<"抽樣個數:\n";
cin>>n;
vector<double> X(n);
cout<<"分配所需參數:"<<endl;
srand(getpid());
switch(d){
//其他case是其他分配 沒問題 所以就沒放上來
case 5 :
cin>>a;
cout<<endl;
T1 = clock();
X=rand_poi(n,a);
break;
}
//計算樣本平均
for(int i=0;i<n;++i) sum+=X[i];
printf("sample_mean=%f\n",sum/n);
//計算樣本變異數
for(int i=0;i<n;++i) std+=pow((X[i]-sum/n),2);
printf("sample_var=%f\n",std/(n-1.));
T2 = clock();
cout << "Running time = " << (T2-T1)/1000.0 << "(s)"<<endl;
system("pause");
return 0;
}
vector<double> rand_poi( const int &N,const double &lambda){
vector<double> X(N);
double t,u;
for(int i=0;i<N;++i){
t=0;
while(t<=1){
u=rand()*1./(RAND_MAX+1.);
t=t-log(u)/lambda;
if(t>1) break;
else X[i]+=1;
}
}
return X;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.120.43.190
※ 編輯: usttsu 來自: 122.120.43.190 (04/14 18:23)
※ 編輯: usttsu 來自: 122.120.43.190 (04/14 18:28)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章