そのまんまコピーはやめといたほうがいいよ
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define COUNT 41
#define TIMES 10000
#define SFMT_MEXP 19937
#define HAVE_SSE2 1
#include "dSFMT.c"
double calc_kai2(double kimu[4],int dat[4]);
void gennum(int cnt,double kimu_prob[4],int gen[4]);
//A O B AB
int main(void){
//帰無仮説の確率
double kimu_prob[4]={0.4,0.3,0.2,0.1};
double kimu[4];
//genは演算用、realに実際の教室での人数が入る
int gen[4],real[4]={13,12,12,4};
//TIMES(試行)回数分χ2乗値を格納する
double kai2s[TIMES],kai2,prob_big;
int i,bigger_cnt;
int seed=(unsigned) time(NULL);
init_gen_rand(seed);
for(i=0;i<4;i++){
kimu[i]=COUNT*kimu_prob[i];
}
printf("kr0:%f\n",kimu[0]);
kai2=calc_kai2(kimu,real);
printf("kai2:%f\n",kai2);
for(i=0;i<TIMES;i++){
gennum(COUNT,kimu_prob,gen);
kai2s[i]=calc_kai2(kimu,gen);
//printf("%f\n",kai2s[i]);
}
bigger_cnt=0;
for(i=0;i<TIMES;i++){
if(kai2<kai2s[i]){
bigger_cnt++;
}
}
prob_big=(double)(bigger_cnt)/TIMES;
printf("prob_big:%f\n",prob_big);
return 0;
}
double calc_kai2(double kimu[4],int dat[4]){
int i;
double kai2;
kai2=0;
for(i=0;i<4;i++){
kai2+=(dat[i]-kimu[i])*(dat[i]-kimu[i])/kimu[i];
}
return kai2;
}
void gennum(int cnt,double kimu_prob[4],int gen[4]){
int i,j,chk;
double conv,rnum;
for(i=0;i<4;i++){
gen[i]=0;
}
for(i=0;i<cnt;i++){
rnum=genrand_close_open();
conv=0;
for(j=0;j<4;j++){
conv+=kimu_prob[j];
if(rnum<conv){
gen[j]++;
//printf("%d\t%d\t%f\t%f\n",i,j,rnum,conv);
break;
}
if(j==3){
//ありえない場合
printf("error:%d\t%d\t%f\t%f\n",i,j,rnum,conv);
}
}
}
chk=0;
for(j=0;j<4;j++){
chk+=gen[j];
}
if(chk!=cnt){
//ありえない場合
printf("error:%d\t",chk);
}
}