2項分布

2項分布による生起確率の計算例です。

2項分布(list_66.c)
//-----------------------------------------------------------------
// list_66.c:
//     2項分布のエミュレート
//-----------------------------------------------------------------
#include <stdio.h>
#include <math.h>

#define N 35
#define P 0.2
//-----------------------------------------------------------------
double binomial_p(int n,double p,int bk);
unsigned long long calc_casen(int n,int r);
//-----------------------------------------------------------------

int main()
{
    int i,pi;
    //--------------------------------------------------
    // 二項分布のエミュレート(確率の変化):
    // 生起確率が大きくなると分布が回数大の方へ移動
    //-------------------------------------------------
    printf("**確率の変化\n");
    printf("生起回数\t生起確率\n");
    printf("\t");
    for(pi=1;pi<=5;pi++) printf("%.1lf\t",P*pi);
    printf("\n");
    for(i=0;i<=N;i++){
        printf("%d:\t",i);
        for(pi=1;pi<=5;pi++){
            printf("%.1lf\t",binomial_p(N,P*pi,i)*100);
        }
        printf("\n");
    }
    //--------------------------------------------------
    // 二項分布のエミュレート(総事象数の変化):
    // 総事象数が増すと、分布が左右対照に近くなる
    //--------------------------------------------------
    printf("\n**事象数の変化\n");
    printf("生起回数\tその確率\n");
    printf("\t");
    for(pi=1;pi<=5;pi++) printf("%d\t",5*pi);
    printf("\n");
    for(i=1;i<=N;i++){
        printf("%d:\t",i);
        for(pi=1;pi<=5;pi++){
            printf("%.2lf\t",binomial_p(5*pi,P,i)*100);
        }
        printf("\n");
    }
    return 0;
}
//-----------------------------------------------------------------
// 2項分布(B(n,p))の確率計算
//-----------------------------------------------------------------
// 確率pで毎回独立に起こる事象がn回のうちk回起こる確率:
//   P{k}=nCk*p^k*(1-p)^(n-k)
//-----------------------------------------------------------------
double binomial_p(int n,double p,int bk)
{
    double q=(1-p),bp;
    bp = calc_casen(n,bk) * pow(p,bk) * pow(q,n-bk);
    return bp;
}

//-----------------------------------------------------------------
// 組合せ数 nCr の計算[Pascalの3角形による方法]
//-----------------------------------------------------------------
unsigned long long calc_casen(int n,int r)
{
    int i,j,nn=n;
    unsigned long long* a=
        (unsigned long long*)calloc(n,sizeof(unsigned long long));
    unsigned long long retv;
    if(nn-r<r) r=nn-r;
    if(r==0) return 1; if(r==1) return nn;
    for(i=1;i<r;i++) a[i]=i+2;
    for(i=3;i<=nn-r+1;i++){
        a[0]=i;
        for(j=1;j<r;j++) a[j]+=a[j-1];
    }
    retv = a[r-1];
    free(a);
    return retv;
}

result
**確率の変化
生起回数	生起確率
	0.2	0.4	0.6	0.8	1.0	
0:	0.0	0.0	0.0	0.0	0.0	
1:	0.4	0.0	0.0	0.0	0.0	
2:	1.5	0.0	0.0	0.0	0.0	
3:	4.1	0.0	0.0	0.0	0.0	
4:	8.3	0.0	0.0	0.0	0.0	
5:	12.9	0.1	0.0	0.0	0.0	
6:	16.1	0.2	0.0	0.0	0.0	
7:	16.6	0.7	0.0	0.0	0.0	
8:	14.6	1.6	0.0	0.0	0.0	
9:	10.9	3.2	0.0	0.0	0.0	
10:	7.1	5.5	0.0	0.0	0.0	
11:	4.0	8.3	0.0	0.0	0.0	
12:	2.0	11.1	0.1	0.0	0.0	
13:	0.9	13.0	0.3	0.0	0.0	
14:	0.4	13.7	0.8	0.0	0.0	
15:	0.1	12.8	1.7	0.0	0.0	
16:	0.0	10.6	3.1	0.0	0.0	
17:	0.0	7.9	5.3	0.0	0.0	
18:	0.0	5.3	7.9	0.0	0.0	
19:	0.0	3.1	10.6	0.0	0.0	
20:	0.0	1.7	12.8	0.1	0.0	
21:	0.0	0.8	13.7	0.4	0.0	
22:	0.0	0.3	13.0	0.9	0.0	
23:	0.0	0.1	11.1	2.0	0.0	
24:	0.0	0.0	8.3	4.0	0.0	
25:	0.0	0.0	5.5	7.1	0.0	
26:	0.0	0.0	3.2	10.9	0.0	
27:	0.0	0.0	1.6	14.6	0.0	
28:	0.0	0.0	0.7	16.6	0.0	
29:	0.0	0.0	0.2	16.1	0.0	
30:	0.0	0.0	0.1	12.9	0.0	
31:	0.0	0.0	0.0	8.3	0.0	
32:	0.0	0.0	0.0	4.1	0.0	
33:	0.0	0.0	0.0	1.5	0.0	
34:	0.0	0.0	0.0	0.4	0.0	
35:	0.0	0.0	0.0	0.0	100.0	

**事象数の変化
生起回数	その確率
	5	10	15	20	25	
1:	40.96	26.84	13.19	5.76	2.36	
2:	20.48	30.20	23.09	13.69	7.08	
3:	5.12	20.13	25.01	20.54	13.58	
4:	0.64	8.81	18.76	21.82	18.67	
5:	0.03	2.64	10.32	17.46	19.60	
6:	0.00	0.55	4.30	10.91	16.33	
7:	0.00	0.08	1.38	5.45	11.08	
8:	0.00	0.01	0.35	2.22	6.23	
9:	0.00	0.00	0.07	0.74	2.94	
10:	0.00	0.00	0.01	0.20	1.18	
11:	0.00	0.00	0.00	0.05	0.40	
12:	0.00	0.00	0.00	0.01	0.12	
13:	0.00	0.00	0.00	0.00	0.03	
14:	0.00	0.00	0.00	0.00	0.01	
15:	0.00	0.00	0.00	0.00	0.00	
16:	0.00	0.00	0.00	0.00	0.00	
17:	0.00	0.00	0.00	0.00	0.00	
18:	0.00	0.00	0.00	0.00	0.00	
19:	0.00	0.00	0.00	0.00	0.00	
20:	0.00	0.00	0.00	0.00	0.00	
21:	0.00	0.00	0.00	0.00	0.00	
22:	0.00	0.00	0.00	0.00	0.00	
23:	0.00	0.00	0.00	0.00	0.00	
24:	0.00	0.00	0.00	0.00	0.00	
25:	0.00	0.00	0.00	0.00	0.00	
26:	0.00	0.00	0.00	0.00	0.00	
27:	0.00	0.00	0.00	0.00	0.00	
28:	0.00	0.00	0.00	0.00	0.00	
29:	0.00	0.00	0.00	0.00	0.00	
30:	0.00	0.00	0.00	0.00	0.00	
31:	0.00	0.00	0.00	0.00	0.00	
32:	0.00	0.00	0.00	0.00	0.00	
33:	0.00	0.00	0.00	0.00	0.00	
34:	0.00	0.00	0.00	0.00	0.00	
35:	0.00	0.00	0.00	0.00	0.00	
inserted by FC2 system