ニ項分布の平均と分散
double fact(int num){
double rs=1.0;
for (int i=1;i<=num;i++){
rs = rs*i;
}
return rs;
}
for(k=0;k<=nnum;k++){
cb=comb(nnum,k);
prob=cb*Math.pow(pb,k)*Math.pow(1.0-pb,nnum-k);
prb[k]=prob;
//System.out.println("k:"+k+" prb:"+prb[k]);
}
double avrg(){
double psum=0.0;
int k;
for(k=0;k<=nnum;k++){
psum=psum+k*prb[k];
//System.out.println("avrg k:"+k+" prb:"+prb[k]+" sum:"+psum);
}
return psum;
}
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Binomi extends Applet {
double prb[]=new double[100];
int nnum=-1;
double av=0.0,sd=0.0;
private TextField nField = new TextField();
private Button button1 = new Button();
private TextField pbField = new TextField();
private Label label1 = new Label();
private Label label2 = new Label();
private Label avrgLabel = new Label();
private Label label4 = new Label();
private Label stdvlabel = new Label();
private Label label3 = new Label();
//コンポーネントの初期化
public void init() {
label2.setText("回数");
label2.setBounds(new Rectangle(20, 250, 50, 20));
nField.setText("5");
nField.setBounds(new Rectangle(80, 250, 50, 20));
button1.setLabel("計算");
button1.setBounds(new Rectangle(80, 170, 70, 25));
button1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
button1_actionPerformed(e);
}
});
pbField.setText("0.5");
pbField.setBounds(new Rectangle(200, 250, 60, 20));
label1.setText("確率");
label1.setBounds(new Rectangle(150, 250, 30, 20));
avrgLabel.setBackground(Color.cyan);
avrgLabel.setText("0.0");
avrgLabel.setBounds(new Rectangle(80, 220, 60, 20));
label4.setText("平均");
label4.setBounds(new Rectangle(20, 220, 30, 20));
stdvlabel.setBackground(Color.cyan);
stdvlabel.setText("0.0");
stdvlabel.setBounds(new Rectangle(200, 220, 45, 20));
label3.setText("分散");
label3.setBounds(new Rectangle(150, 220, 40, 20));
this.setLayout(null);
this.add(nField, null);
this.add(label2, null);
this.add(avrgLabel, null);
this.add(label4, null);
this.add(button1, null);
this.add(pbField, null);
this.add(label1, null);
this.add(stdvlabel, null);
this.add(label3, null);
}
//階乗の計算
double fact(int num){
double rs=1.0;
for (int i=1;i<=num;i++){
rs = rs*i;
}
return rs;
}
//組み合わせ数の計算
double comb(int nnum,int knum) {
double rs=1.0;
for (int i=nnum;i>nnum-knum;i--){
rs = rs*i;
}
return rs/fact(knum);
}
//2項分布の確率計算
void button1_actionPerformed(ActionEvent e) {
nnum=Integer.parseInt(nField.getText());
double pb=Double.parseDouble(pbField.getText());
int k=0;
double cb;
double prob=0.0;
for(k=0;k<=nnum;k++){
cb=comb(nnum,k);
prob=cb*Math.pow(pb,k)*Math.pow(1.0-pb,nnum-k);
prb[k]=prob;
//System.out.println("k:"+k+" prb:"+prb[k]);
}
av=avrg();//平均の計算
sd=p2avrg()-av*av;//分散の計算
avrgLabel.setText(Double.toString(av));
stdvlabel.setText(Double.toString(sd));
repaint();//再表示
}
//平均の計算
double avrg(){
double psum=0.0;
int k;
for(k=0;k<=nnum;k++){
psum=psum+k*prb[k];
//System.out.println("avrg k:"+k+" prb:"+prb[k]+" sum:"+psum);
}
return psum;
}
//2乗和の計算
double p2avrg(){
int k;
double sdsum=0.0;
for(k=0;k<=nnum;k++){
sdsum=sdsum+k*k*prb[k];
//System.out.println("avrg k:"+k+" prb:"+prb[k]+" sum:"+sdsum);
}
return sdsum;
}
//グラフ表示
public void paint(Graphics g){
//グラフ表示
int i;
//グラフの原点
int ox=20,oy=150;
double pmax=0.0;
//確率の最大値を求める
for(i=0;i<=nnum;i++){
if(pmax<prb[i]) pmax=prb[i];
}
for(i=0;i<=nnum;i++){
// (int)は整数型に変換、最大値を長さ100で表示
g.drawLine(ox+i*5,oy,ox+i*5,(int)(oy-prb[i]*100/pmax));
}
}
}//class