// VariationList.java// Written by Julian Devlin, 8/97, for the text book// "Introduction to Probability," by Charles M. Grinstead & J. Laurie Snell// Something does not work at allimport java.applet.Applet;import java.awt.*;public class VariationList	extends java.applet.Applet{	TextArea disp;		// Area to display HT		Panel dispArea;	Panel controls;		// Panel for user controls		Label numl1, numl2, numl3;			// Controls	TextField num1, num2, num3;	Button go;		GridBagLayout gbl;	GridBagConstraints cc;			// Initialize applet	public void init()	{			numl1 = new Label("No. of cards =");			// Create controls		num1 = new TextField("10", 4);		numl2 = new Label("Min shuffles =");			// Create controls		num2 = new TextField("1", 4);		numl3 = new Label("Max shuffles =");			// Create controls		num3 = new TextField("5", 4);		go = new Button("Go");				disp = new TextArea(15, 20);		// Create display area				dispArea = new Panel();				// Set up window		controls = new Panel();		setLayout(new BorderLayout(5, 5));				add("South", controls);		add("Center", dispArea);				dispArea.setLayout(new GridLayout(1, 1));		dispArea.add(disp);				gbl = new GridBagLayout();		controls.setLayout(gbl);				cc = new GridBagConstraints();				cc.gridx = 1;		cc.gridy = 0;		gbl.setConstraints(numl1, cc);		controls.add(numl1);				cc.gridx = 2;		gbl.setConstraints(num1, cc);		controls.add(num1);				cc.gridx = 0;		cc.gridy = 1;		gbl.setConstraints(numl2, cc);		controls.add(numl2);				cc.gridx = 1;		gbl.setConstraints(num2, cc);		controls.add(num2);				cc.gridx = 2;		gbl.setConstraints(numl3, cc);		controls.add(numl3);				cc.gridx = 3;		gbl.setConstraints(num3, cc);		controls.add(num3);			cc.gridx = 0;		cc.gridy = 2;		cc.gridwidth = 4;		gbl.setConstraints(go, cc);		controls.add(go);				validate();	}		// Handle events	public boolean handleEvent(Event evt)	{		if (evt.target instanceof Button)		{			if (evt.target == go && evt.id == Event.ACTION_EVENT)	// When button is clicked			{				disp.setText("");			// Reset output window        		simulate(Integer.valueOf(num1.getText()).intValue(),        			Integer.valueOf(num2.getText()).intValue(),        			Integer.valueOf(num3.getText()).intValue());        		return true;					// Generate correct number of tosses			}		}		return super.handleEvent(evt);	// Handle other events as usual	}		public double a(int n, int a) {		if (a == 1)			return 1;		else {			double total = (int) Math.pow((double) a,(double) n);			for (int r = 1; r <= (a - 1); r++) {				total -= (Combinatorics.choose(n + a - r, n) * a(n, r));			}			return total;			}		}		public double dist(int n, int s) {		double sum = 0;		for (int r = 1; r <= n; r++) {			sum += (.5 * a(n, r) * Math.abs(Combinatorics.choose((int) Math.pow(2, 				s) + n - r, n) / Math.pow(2, n * s) )); // - 1f / (float) Combinatorics.fact(n)));			}		return sum;	}		// Calculate probabilities    public void simulate(int num, int min, int max)    {	    	disp.appendText("s            Variation distance\n\n");    	for (int i = min; i <= max; i++) {    		disp.appendText(String.valueOf(i) + "          "     			+ dist(num, i) + "\n");	    }    }}
