中心極限定理
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