正規乱数を生成させてプロットするアプレットプログラム 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 ( u 1 ) sin ( 2 u 2 ) 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]); // 棒グラフ 数値は多少調整すべし }
© Copyright 2024 ExpyDoc