// BranchingSimulation.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 BranchingSimulation	extends java.applet.Applet{	MultiLineGraph mlg;				// AWT elements		Float[] xc;	Float[] yc;		Panel dispArea;	Panel controls;		// Panel for user controls	Panel prob;		//Label numl;			// Controls	//TextField num;		Label[] pl;	TextField[] p;		Button go;		GridBagLayout gbl, gblp;	GridBagConstraints cc, ccp;		float[] density;	float mean, std;	GeneralSimulation gs;			// Initialize applet	public void init()	{			//numl = new Label("Maximum generations = ");			// Create controls		//num = new TextField("10", 4);		go = new Button("Go");				pl = new Label[10];		p = new TextField[10];		for (int i = 0; i < 10; i++) {			pl[i] = new Label("P(" + i + ") =");			p[i] = new TextField("0", 4);			}		p[0].setText(".2767");		p[1].setText(".3289");		p[2].setText(".1949");		p[3].setText(".0862");		p[4].setText(".0509");		p[5].setText(".0329");		p[6].setText(".0183");		p[7].setText(".0080");		p[8].setText(".0026");		p[9].setText(".0006");				mlg = new MultiLineGraph();				dispArea = new Panel();				// Set up window		controls = new Panel();		prob = new Panel();		setLayout(new BorderLayout(5, 5));				add("South", controls);		add("West", prob);		add("Center", dispArea);				dispArea.setLayout(new GridLayout(1, 1));		dispArea.add(mlg);				gblp = new GridBagLayout();		ccp = new GridBagConstraints();		prob.setLayout(gblp);		for (int i = 0; i < 10; i++) {			ccp.gridx = 0;			ccp.gridy = i;			gblp.setConstraints(pl[i], ccp);			prob.add(pl[i]);			ccp.gridx = 1;			gblp.setConstraints(p[i], ccp);			prob.add(p[i]);			}				gbl = new GridBagLayout();		controls.setLayout(gbl);				cc = new GridBagConstraints();				/*cc.gridx = 0;		cc.gridy = 0;		gbl.setConstraints(numl, cc);		controls.add(numl);				cc.gridx = 1;		gbl.setConstraints(num, cc);		controls.add(num);		*/		//cc.gridx = 0;		//cc.gridy = 1;		//cc.gridwidth = 2;		gbl.setConstraints(go, cc);		controls.add(go);				validate();	}		// Handle events	public boolean handleEvent(Event evt)	{		String minStr, maxStr;		if (evt.target instanceof Button)		{			if (evt.target == go && evt.id == Event.ACTION_EVENT)	// When button is clicked			{        		simulate();        		return true;					// Generate correct number of tosses			}		}		return super.handleEvent(evt);	// Handle other events as usual	}		public float genFunctionDiscrete(float[] prob, float x) {		float sum = 0;		for (int i = 0; i < prob.length; i++) {			sum += prob[i] * (float) Math.pow((double) x, (double) i);		}		return sum;	}		public float expectationDiscrete(float[] prob) {		float sum = 0;		for (int i = 0; i < prob.length; i++) {			sum += i * prob[i];			}		return sum;	}		public float varianceDiscrete(float[] prob) {		 float sum = -1 * expectationDiscrete(prob);		 for (int i = 0; i < prob.length; i++) {		 	sum += (float) Math.pow((double) i, 2) * prob[i];			 }			 return sum;	}		public float sampleNormal(float mean, float std) {		return std * (float) Math.pow(-2 * Math.log(Math.random()), .5) * 			(float) Math.cos(2 * Math.PI * Math.random()) + mean;		}		// Calculate probabilities    public void simulate()    {	    	float[] prob = new float[10];		float probability = 0;		float sum = 0;		int generation;		float genSize;		int changePoint = 500;		int offspring;		float genMean;		float genStd;				xc = new Float[260];		yc = new Float[260];				for (int i = 0; i < 10; i++) {			prob[i] = Float.valueOf(p[i].getText()).floatValue();				sum += prob[i];		}		for (int i = 0; i < 10; i++) {			prob[i] = round(prob[i] / sum, .001f);			p[i].setText(String.valueOf(prob[i]));		}				float mean = expectationDiscrete(prob);		float variance = varianceDiscrete(prob);		gs = new GeneralSimulation(prob);				for (int exp = 0; exp < 10; exp++) {			generation = 0;			genSize = 1;			for (int g = 0; g < 25; g++) {				xc[(exp * 26) + g] = new Float(g);				yc[(exp * 26) + g] = new Float(genSize / (float) Math.pow((double)					mean, (double) g));				if (genSize < changePoint) {					offspring = 0;					for (int parent = 0; parent < genSize; parent++) {						offspring += gs.nextRand();						}					genSize = offspring;				}				else {					genMean = genSize * mean;					genStd = (float) Math.pow((double) genSize, .5);					genSize = sampleNormal(genMean, genStd);				}			}			xc[(exp * 26) + 25] = new Float(25);			yc[(exp * 26) + 25] = new Float(genSize / (float) Math.pow((double)				mean, (double) 25));		}				dispArea.remove(mlg);		mlg = new MultiLineGraph(xc, yc, 26);	// Create new LineSpikeGraph		dispArea.add(mlg);				validate();	}		public float round(float num, float accuracy) {		return accuracy * Math.round(num / accuracy);	}	}
