中心極限定理
for( i = 0; i < num;i++ ){ if(checkboxNormal.getState())rv=NormRand(); else rv=Math.random(); sd = sd + (rv)*(rv); st=st + rv; //頻度表の更新 irv=(int)(rv*24); if (irv>=ranum ) irv=ranum-1; //System.out.println("normal1:"+rv+" num: "+irv+" rank "+rank[irv]); rank[irv]++;//頻度を更新する }
import java.awt.*; import java.awt.event.*; import java.applet.*; public class StOfAv extends Applet { boolean BultIn=true; long arp; int num=500; int avnum=12; int ranum=24; int rank[]=new int[ranum]; boolean first=true,paintOK=false; private boolean isStandalone = false; private Button button1 = new Button(); private CheckboxGroup checkboxGroup1 = new CheckboxGroup(); private Checkbox checkboxUni = new Checkbox(); private Checkbox checkboxNormal = new Checkbox(); private Label labelAv = new Label(); private Label labelAvVal = new Label(); private Label labelSd = new Label(); private Label labelSdVal = new Label(); private TextField nField = new TextField(); private Label label1 = new Label(); //引数値の取得 public String getParameter(String key, String def) { return isStandalone ? System.getProperty(key, def) : (getParameter(key) != null ? getParameter(key) : def); } //コンポーネントの初期化 public void init() { int i; for(i=0;i<ranum;i++) rank[i]=0; checkboxNormal.setState(false); checkboxUni.setState(true); button1.setLabel("試行"); button1.setBounds(new Rectangle(16, 184, 63, 23)); button1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button1_actionPerformed(e); } }); this.setLayout(null); checkboxUni.setCheckboxGroup(checkboxGroup1); checkboxUni.setLabel("一様"); checkboxUni.setBounds(new Rectangle(103, 187, 54, 20)); checkboxNormal.setCheckboxGroup(checkboxGroup1); checkboxNormal.setLabel("平均の分布"); checkboxNormal.setBounds(new Rectangle(173, 187, 81, 20)); labelAv.setText("平均"); labelAv.setBounds(new Rectangle(38, 159, 34, 20)); labelAvVal.setText("0.0"); labelAvVal.setBounds(new Rectangle(90, 159, 58, 20)); labelSd.setText("分散"); labelSd.setBounds(new Rectangle(166, 160, 33, 18)); labelSdVal.setText("0.0"); labelSdVal.setBounds(new Rectangle(206, 162, 46, 17)); nField.setText("12"); nField.setBounds(new Rectangle(277, 185, 38, 22)); label1.setText("平均する数"); label1.setBounds(new Rectangle(267, 159, 60, 20)); this.add(labelSd, null); this.add(button1, null); this.add(checkboxUni, null); this.add(checkboxNormal, null); this.add(nField, null); this.add(labelSdVal, null); this.add(labelAvVal, null); this.add(labelAv, null); this.add(label1, null); } public void paint(Graphics g) { int rx=300,ry=100,i; int ox=10,oy=10,scale=3,sx; int bottom,top,left,right,se; //頻度分布表の表示 sx=ox;bottom=ry+oy; for(i=0;i<ranum;i++){ //TRACE("rank %d %d \n",i,rank[i]); top=ry-(int)(ry*scale*rank[i]/num)+oy; se=(int)((float)rx/ranum*(i+1)); left=sx; right=ox+se; sx=right; g.drawRect(left,top,right-left,bottom-top); //System.out.println("paint:"+left+" "+top+" "+(-left+right)+" "+(bottom-top)); } } void button1_actionPerformed(ActionEvent e) { //2種の乱数の頻度表作成と平均・分散の計算 int i; double sd=0.0,st=0.0,rv; double av,sv; int irv; for(i=0;i<ranum;i++) rank[i]=0; for( i = 0; i < num;i++ ){ if(checkboxNormal.getState())rv=NormRand(); else rv=Math.random(); sd = sd + (rv)*(rv); st=st + rv; //頻度表の更新 irv=(int)(rv*24); if (irv>=ranum ) irv=ranum-1; //System.out.println("normal1:"+rv+" num: "+irv+" rank "+rank[irv]); rank[irv]++;//頻度を更新する } av=st/num; sv=sd/num-av*av; paintOK=true; repaint(); labelAvVal.setText(Double.toString(av)); labelSdVal.setText(Double.toString(sv)); } double NormRand() { int i; //指定個数の一様乱数の平均 avnum=0; double rt=0.0; avnum=Integer.parseInt(nField.getText()); for( i = 0;i < avnum;i++ ){ rt = Math.random() + rt; } return (rt/avnum); //平均値を0にする } }//class