// LondonBombs.java// Written by Julian Devlin, 8/97, for the text book// "Introduction to Probability," by Charles M. Grinstead & J. Laurie Snellimport java.applet.Applet;import java.awt.*;public class LondonBombs extends java.applet.Applet{	Float[] bombX;	Float[] bombY;		Float[] xc;		// Variables for simulation - on unit circle	Float[] yoc;	Float[] yec;		Float[] abgX;	Float[] abgY;		int[][] hits;		OESpikeGraph oesg;				// AWT elements	BombArea ba;	Label message;	Button go;	TextField num;			Panel graphArea;	Panel controls;		JRandom myRand;	// Set up all controls and put them in the window	public void init() {		message = new Label("No. of Bombs =");	// Create controls		go = new Button("Simulate");		num = new TextField(4);				graphArea = new Panel();				// Set up window		controls = new Panel();		setLayout(new BorderLayout(5, 5));			controls.setLayout(new FlowLayout());		controls.add(message);		controls.add(num);		controls.add(go);				oesg = new OESpikeGraph(); // initialize a graphing space		ba = new BombArea();		add("Center", graphArea);		graphArea.setLayout(new GridLayout(2, 1));		graphArea.add(ba);		graphArea.add(oesg);		add("South", controls);				myRand = new JRandom();	}			// Does the simulation, creating two arrays to store game states, then passes them	// to a AreaBarGraph	public void simulate(int n) {		bombX = new Float[n + 1];					// Make arrays		bombY = new Float[n + 1];				xc = new Float[11];		yoc = new Float[11];		yec = new Float[11];				hits = new int[10][10];		for (int i = 0; i < 10; i++) {			for (int j = 0; j < 10; j++) {				hits[i][j] = 0;			}		}				int[] temp = new int[11];				for (int i = 0; i < 11; i++) {			xc[i] = new Float(i);			yec[i] = new Float((float) Math.pow(Math.E, (double) -1 * (double) n / (double) 100) * 				(float) Math.pow((double) n / (double) 100, (double) i) / Combinatorics.fact(i));			temp[i] = 0;		}				for (int i = 0; i < n + 1; i++) {				// Do actual simulation			bombX[i] = new Float(myRand.nextFloat(0, 1));			bombY[i] = new Float(myRand.nextFloat(0, 1));						hits[(int) Math.floor(bombX[i].floatValue() * 10)]				[(int) Math.floor(bombY[i].floatValue() * 10)]++;		}				for (int i = 0; i < 10; i++) {			for (int j = 0; j < 10; j++) {				if (hits[i][j] < 11)					temp[hits[i][j]]++;			}		}				for (int i = 0; i < 11; i++) {			yoc[i] = new Float((float) temp[i] / (float) 100);		}				graphArea.remove(ba);		graphArea.remove(oesg);		ba = new BombArea(bombX, bombY);		oesg = new OESpikeGraph(xc, yoc, yec);	// Create new AreaBarGraph		graphArea.add(ba);		graphArea.add(oesg);									validate();	}		// Watch for a click on the go button	public boolean action(Event evt, Object arg) {		if (evt.target instanceof Button) {			if ((String)arg == "Simulate") {				int n = 0;				try {					n = Integer.parseInt(num.getText().trim());		// Get user input				}				catch (Exception e) {					num.setText("");					validate();				}				simulate(n);			}		}		return true;	}		public Insets insets() {    	return new Insets(5,5,5,5);	}}
