/* S0320.java * pが小さくnが大きい場合のベルヌーイ試行(ポアソン分布) * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.text.*; public class S0320 extends Applet{ public void paint(Graphics g) { int NUMBER = 1000000; int j; /* forのカウンタ */ int k; /* 成功の回数 */ int n; /* 試行回数 */ int b[] = new int [20]; /* 度数 */ double p; /* 確率 */ double lambda; /* λ */ double poiss; /* ポアソン分布のシミュレーション結果 */ p = 0.01; /* 確率小 */ n = 100; /* 回数大 */ lambda = n * p; DecimalFormat exFormat1 = new DecimalFormat(" 0.000000"); for (j = 1; j <= NUMBER; j ++) { k = bernoulli(p, n); b[k] = b[k] + 1; } g.drawString(" k simulation theory", 10, 10); for (k = 0; k <= 10; k ++) { /* k=10まで表示 */ poiss = (double)b[k] / NUMBER; g.drawString(" " + k, 10 , 20 + 10 * k); g.drawString(" " + exFormat1.format(poiss), 40 , 20 + 10 * k); g.drawString(" " + exFormat1.format(poisson(lambda, k)), 120 , 20 + 10 * k); } } /* ベルヌーイの試行 */ public static int bernoulli(double p, int n) { int k, i; k = 0; for (i = 1; i <= n; i++) { if (p > Math.random()) { k = k + 1; } } return (k); } /* ポアソン分布の理論値 */ public static double poisson(double lambda, int k) { int i; long k1 = 1; double b; for (i = 1; i <= k; i ++) { /* kの階乗の計算 */ k1 = k1 * i; } b = Math.pow(lambda, (double)k) / (double)k1 * Math.exp(-lambda); return (b); } }