正規乱数を生成させてプロットするアプレットプログラム
import java.applet.Applet;
import java.awt.*;
import java.util.*;
// 乱数を生成する時に必要
public class RandomGauss extends Applet {
int [] a = new int[300]; // 配列aを宣言し、要素数300の配列
// 領域を確保
double x; int c = 0;
// cはカウンタ
public void paint(Graphics g) {
// ・・・ ここにプログラムを書く
} // end paint
} // end RandomGauss
Random r = new Random();
for (int i=1; i<=10000; i++) { // 10000個の乱数を発生させる
x = r.nextGaussian();
// 正規乱数の値をxに代入
int d=(int)(x*45+150.0);
// (i)
if (d<0 || d>=300) continue; // (ii)
a[d]++;
// a[d]に落ちた値の個数を一つずつ積み増し
}
(i) 標準正規分布では(-3, 3)の区間に99.74%の値が落ちる。アプレットの
描画領域を(300,350)に設定したので、横軸上で-3は-3*45+150=15、
0は0*45+150=150、3は3*45+150=285として表示されるようにした。
原点が描画領域の真ん中に来るように右方向に150平行移動してある。
(ii) 配列要素数の範囲外の値ならスキップ。forループの最初に戻る。その値
はグラフに描かれない。
for (int j=0; j<300; j++) { // 描画
g.fillOval(j, 350-a[j],2,2);
// アプレットの描画領域の原点は左上端
}
g.drawString(“[-2.0, 2.0]の相対度数“
+(double)c/10000, 10, 10);
アプレットの描画領域を(300,350)に設定した。
注: アプレットの描画領域の設定に依存しない仕組みは、このプログラム
には組み込まれていない。(sample7参照)
Box-Muller法:nextGaussian()で実装されている
擬似乱数生成方法
[0,1]区間での一様乱数から正規乱数を生成する
方法のひとつ:u1、u2を2つの一様乱数とすると、
xは平均μ、標準偏差σの正規分布に従う(sinは
cosでもよい)。 JavaではMath.log()、Math.sqrt()、
Math.sin()、Math.PIなどを 使ってxを生成する。
x   2 log (u1 ) sin (2 u2 )  
2
アプレットの描画領域の設定に依存しない仕組み
int w,h,hw;
w=getSize().width; h=getSize().height; hw=w/2;
// Y軸を画面の真ん中に取るためにhwを定義
g.setColor(Color.blue);
for (int i=0; i<300;i++) {
g.drawLine(hw-150+i, h, hw+150+i, h-a[i]);
// 棒グラフ 数値は多少調整すべし
}
ダウンロード

正規乱数の可視化 - Info Shako