/* S0520.java * モンテカルロ法によるπ * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.awt.event.*; import window.Window; public class S0520 extends Applet implements ActionListener { Button button0; Button button1; boolean sw = false; public void init() { button0 = new Button(" 実行 "); button1 = new Button("クリア"); add(button0); add(button1); button0.addActionListener(this); button1.addActionListener(this); } public void actionPerformed(ActionEvent e) { String label = e.getActionCommand(); if (label.equals(" 実行 ")) sw = true; else sw = false; repaint(); } public void paint(Graphics g) { Window w; w = new Window(); int height; int width; int NUMBER = 10000; /* 雨滴の数 */ int SPACE = 30; int j; /* forのカウンタ */ int xl; /* forのカウンタ */ int n1 = 0; /* 円の中に入った雨滴 */ double x0, y0; /* 雨滴の座標 */ double pi = 0.0; /* πの近似値 */ /* スクリーンの大きさを読み取る */ width = getSize().width; height = getSize().height; /* グラフィックの準備 */ w.setWindow(0, 0, 0, 1, 1, SPACE, height/2 + SPACE, height/2 + SPACE, SPACE); w.axis(0, "", 1.0,"", 1.0, g); w.setWindow(1, 0, 0, NUMBER, 4, SPACE, height - SPACE, width - SPACE, height/2 + 2*SPACE); w.axis(1, "j", NUMBER / 10, "pi",1.0, g); /* メイン */ if (sw == true) { w.moveTo(1, 0.0, 0.0, g); for (j = 1; j <= NUMBER; j ++) { x0 = Math.random(); y0 = Math.random(); if (x0 * x0 + y0 * y0 < 1.0) { /* 円の中に入った場合 */ n1 = n1 + 1; g.setColor(Color.blue); w.putPixel(0, x0, y0, g); } pi = (double)n1 / j * 4; g.setColor(Color.green); w.lineTo(1, (double)j, pi, g); } g.setColor(Color.black); g.drawString(" pi = " + pi, 10, 10); stop(); } } }