| | HOME | 目次 | | 2009 (C) H.Ishikawa |
| 3.1 | コインを投げる実験−−二項分布−− | ||
| 3.2 | ごくまれにしか起こらないこと−−ポアソン分布−− | ||
| 3.3 | ごくまれにしか起こらないことの時間間隔−−指数分布−− | ||
| 3.4 | 大数の法則−−何回も繰り返す−− | ||
| 3.5 | 中心極限定理−−たくさんのサイコロを投げる−− | ||
| 演習 |
| 図3.1.1 コイン投げ |
![]() |
![]() |
・・・・・ | 式3.1.1 |
![]() |
・・・・・ | 式3.1.2 |
| 図3.1.2 ベルヌーイ試行 |
![]() |
![]() |
・・・・・ | 式3.1.3 |
| 図3.1.3 ベルヌーイの試行の シミュレーション結果 |
![]() |
| S0310.java ベルヌーイの試行のシミュレーション | Download | 実行 | |
/* S0310.java
* ベルヌーイ試行のシミュレーション
* (C) H.Ishikawa 2008
*/
package simulation;
import java.applet.*;
import java.awt.*;
import java.text.*;
public class S0310 extends Applet{
public void paint(Graphics g) {
int M = 1000000; /*発生させる乱数の数*/
int j; /* forのカウンタ */
int k; /* 表の出た回数 */
int n = 6; /* コイン投げの回数 */
int b[] = new int [20]; /* 度数 */
double p = 0.5; /* 表の出る確率 */
double binom; /* 理論値 */
DecimalFormat exFormat1 = new DecimalFormat(" 0.000000");
for (j = 1; j <= M; j ++) {
k = bernoulli(p, n);
b[k] = b[k] + 1;
}
g.drawString(" k simulation theory", 10, 10);
for (k = 0; k <= n; k ++) {
binom = (double) b[k] / M;
g.drawString(" " + k, 10 , 20 + 10 * k);
g.drawString(" " + exFormat1.format(binom), 40 , 20 + 10 * k);
g.drawString(" " + exFormat1.format(binomial(p, n, 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 binomial(double p, int n, int k){
int i;
int k1 = 1;
int n1 = 1;
double b;
for (i = 1; i <= k; i ++) {
k1 = k1 * i;
}
for (i = n - k + 1; i <= n; i++) {
n1 = n1 * i;
}
b = (double)n1 / k1 * Math.pow(p,(double)k) * Math.pow((1 - p), (double)(n - k));
return (b);
}
}
|
| この章始め |
![]() |
・・・・・ | 式3.2.1 |
| 図3.2.1 ポアソン分布の シミュレーション結果 |
![]() |
| S0320.java ポアソン分布のシミュレーション | Download | 実行 | |
/* 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);
}
}
|
![]() |
・・・・・ | 式3.2.2 |
![]() |
・・・・・ | 式3.2.3 |
| 図3.2.1 時系列的な事象発生 |
![]() |
![]() |
・・・・・ | 式3.2.4 |
![]() |
・・・・・ | 式3.2.5 |
| この章始め |
![]() |
・・・・・ | 式3.3.1 |
![]() |
・・・・・ | 式3.3.2 |
![]() |
・・・・・ | 式3.3.3 |
| ・・・・・ | 式3.3.4 |
| 図3.3.1 到着の間隔 |
![]() |
| 図3.3.2 指数分布のシミュレーション結果 |
![]() |
| S0330.java 指数分布のシミュレーション | Download | 実行 | |
/* S0330.java
* 指数分布のシミュレーション
* (C) H.Ishikawa 2008
*/
package simulation;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import window.Window;
public class S0330 extends Applet implements ActionListener {
Button button0;
public void init() {
button0 = new Button(" 再実行 ");
add(button0);
button0.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
repaint();
}
public void paint(Graphics g){
Window w ;
w = new Window();
double T_END = 1000.0; /* シミュレーション終了時刻 */
double T_DISP = 20.0; /* 事象表示時刻 */
int TAU_MAX = 10; /* τの最大値 */
long j; /* 事象発生の回数 */
int f[] = new int[TAU_MAX + 1]; /* ヒストグラム */
int u; /* τの整数部分 */
double lambda = 1; /* λ */
double dt = 0.01; /* 微小時間 */
double t0 = 0.0; /* 一つ前の事象が発生した時刻 */
double t = 0.0; /* 現在の時刻 */
double tau = 0.0; /* 事象発生の間隔τ */
/* グラフィックの準備 */
int SPACE = 20;
int HIGHT = 400;
int WIDTH = 640;
w.setWindow(0, 0.0, 0.0, T_DISP, 1.0, 0, (int)(2.5*SPACE), WIDTH, (int)(1.5*SPACE));
w.setWindow(1, 0.0, 0.0, T_DISP/2.0, 1.0,
(int)(0.25*WIDTH), (int)(HIGHT-SPACE), (int)(0.75*WIDTH), (int)(4*SPACE));
w.axis(1, "tau", 1.0, "freq", 0.1, g);
/* メイン */
g.setColor(Color.green);
w.moveTo(1, 0, exponent(lambda, 0), g);
while (tau <= TAU_MAX) {
w.lineTo(1, tau, exponent(lambda, tau),g);
tau = tau + dt;
}
j = 0;
while (t <= T_END) {
if ((lambda * dt) > Math.random()) {
if (t < T_DISP) { w.line(0, t, 0, t, 1,g); }
tau = t - t0;
u = (int)tau;
if (u <= TAU_MAX) { f[u] = f[u] + 1;}
t0 = t;
j = j + 1;
}
t = t + dt;
}
/* ヒストグラムを書く */
g.setColor(Color.red);
for (u = 0; u < TAU_MAX ; u ++) {
w.line(1, u + 0.5, 0, u + 0.5, (double)f[u] / j,g);
}
}
public double exponent(double lambda, double tau) {
return(lambda * Math.exp(-lambda * tau));
}
}
|
| この章始め |
![]() |
・・・・・ | 式3.4.1 |
| 図3.4.1 大数の法則シミュレーション結果 |
![]() |
| S0340.java 大数の法則シミュレーション | Download | 実行 | |
/* S0340.java
* 大数の法則
* (C) H.Ishikawa 2008
*/
package simulation;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import window.Window;
public class S0340 extends Applet implements ActionListener {
Button button0;
public void init() {
button0 = new Button(" 再実行 ");
add(button0);
button0.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
repaint();
}
public void paint(Graphics g){
Window w ;
w = new Window();
int SPACE = 20;
int HIGHT = 400;
int WIDTH = 640;
int NUMBER = 1000;
double P = 0.5;
int m;
int k = 0;
w.setWindow(0, 0.0, 0.0, (double)NUMBER, 1.0, SPACE, HIGHT-SPACE, WIDTH-SPACE, 2*SPACE);
w.axis(0, "m", (double)(NUMBER / 10), "k/m", 0.1 , g);
g.setColor(Color.green);
w.moveTo(0, 0.0, 0.0, g);
for (m = 1; m <= NUMBER; m ++) {
if (P > Math.random()) {k = k + 1;}
w.lineTo(0, (double)m, (double)(k) / (double)(m), g);
}
}
}
|
| この章始め |
| 図 3.5.1 2個のサイコロ |
![]() |
![]() |
・・・・・ | 式3.5.1 |
![]() |
・・・・・ | 式3.5.2 |
| 図3.5.2 中心極限定理のシミュレーション結果 |
![]() |
| S0350.java 中心極限定理のシミュレーション | Download | 実行 | |
/* S0350.java
* 中心極限定理
* (C) H.Ishikawa 2008
*/
package simulation;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import window.Window;
public class S0350 extends Applet implements ActionListener {
Button button0;
public void init() {
button0 = new Button(" 再実行 ");
add(button0);
button0.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
repaint();
}
public void paint(Graphics g) {
Window w;
w = new Window();
int SPACE = 30;
int HIGHT = 640;
int WIDTH = 640;
int NUMBER = 5000;
double P = 0.5; /* 確率p */
int SIZE = 100; /* ヒストグラムの大きさ */
int j; /* forのカウンタ */
int i; /* forのカウンタ */
int u; /* xをSIZE等分したものの整数部分 */
int n = 1; /* n = 1, 2, 4, 8, 16 */
double x; /* 一様乱数n個の合計 */
double x1; /* 横軸 */
double y1; /* 縦軸 */
int f[] = new int[SIZE]; /* ヒストグラム */
/* グラフィックの準備 */
int hight = HIGHT / 5 - SPACE;
w.setWindow(0, 0.0, 0.0, 16, 0.05, SPACE, hight, WIDTH - SPACE, SPACE);
w.axis(0, "", 1, "n=1", 0.01, g);
w.setWindow(1, 0.0, 0.0, 16, 0.05, SPACE, 2 * hight, WIDTH - SPACE, hight + SPACE);
w.axis(1, "", 1, "n=2", 0.01, g);
w.setWindow(2, 0.0, 0.0, 16, 0.05, SPACE, 3 * hight, WIDTH - SPACE, 2 * hight + SPACE);
w.axis(2, "", 1, "n=4", 0.01, g);
w.setWindow(3, 0.0, 0.0, 16, 0.05, SPACE, 4 * hight, WIDTH - SPACE, 3 * hight + SPACE);
w.axis(3, "", 1, "n=8", 0.01, g);
w.setWindow(4, 0.0, 0.0, 16, 0.05, SPACE, 5 * hight, WIDTH - SPACE, 4 * hight + SPACE);
w.axis(4, "", 1, "n=16", 0.01, g);
g.setColor(Color.green);
/* メイン */
for (i = 0; i < 5; i++) {
for (j = 1; j <= NUMBER; j++) {
x = central(n);
u = (int) (x * SIZE / n);
f[u] = f[u] + 1;
}
/* ヒストグラムを書く */
for (u = 0; u < SIZE; u++) {
x1 = (double)u / SIZE * n;
y1 = (double)f[u] / NUMBER;
w.line(i, x1, 0, x1, y1, g);
f[u] = 0;
}
n = n * 2;
}
}
public double central(int n) {
int k;
double x = 0.0;
for (k = 0; k < n; k++) {
x = x + Math.random();
}
return (x);
}
}
|
| この章始め |
| この章始め |
| | HOME | 目次 | | 2009 (C) H.Ishikawa |