ニ項分布の平均と分散
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