// Law.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 Law extends java.applet.Applet { //TextArea disp; // Area to display HT Panel dispArea; Panel controls; // Panel for user controls Label[] size; Label[] real; Label[] estimate; Label numl1, numl2; // Controls TextField num1, num2; Button go; GridBagLayout gbl; GridBagConstraints cc; JRandom myRand; // Initialize applet public void init() { numl1 = new Label("probability ="); // Create controls num1 = new TextField(".5", 4); numl2 = new Label("epsilon ="); num2 = new TextField(".1", 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(9, 3)); //dispArea.add(disp); size = new Label[9]; real = new Label[9]; estimate = new Label[9]; for (int r = 0; r < 9; r++) { size[r] = new Label(""); size[r].setAlignment(Label.CENTER); real[r] = new Label(""); real[r].setAlignment(Label.CENTER); estimate[r] = new Label(""); estimate[r].setAlignment(Label.CENTER); } size[0].setText("n"); real[0].setText("P()"); estimate[0].setText("Chebyshev bound"); for (int r = 0; r < 9; r++) { dispArea.add(size[r]); dispArea.add(real[r]); dispArea.add(estimate[r]); } gbl = new GridBagLayout(); controls.setLayout(gbl); cc = new GridBagConstraints(); cc.gridx = 0; cc.gridy = 0; gbl.setConstraints(numl1, cc); controls.add(numl1); cc.gridx = 1; 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 = 0; cc.gridy = 2; cc.gridwidth = 2; gbl.setConstraints(go, cc); controls.add(go); validate(); myRand = new JRandom(); } // 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(Float.valueOf(num1.getText()).floatValue(), Float.valueOf(num2.getText()).floatValue()); return true; // Generate correct number of tosses } } return super.handleEvent(evt); // Handle other events as usual } // Calculate probabilities public void simulate(float p, float e) { int total = 0; int temp; float cheb; float actual; int lb, ub; real[0].setText("P(|An - " + String.valueOf(p) + "| >= " + String.valueOf(e) + ")"); //disp.appendText("n P(|An - " + String.valueOf(p) + //"| >= " + String.valueOf(e) + " Chebyshev bound\n\n"); for (int n = 50; n <= 400; n+= 50) { actual = 0; cheb = p * (1 - p) / ((float) n * (float) Math.pow((double) e, 2)); // Ask about bounds - true basic seems to be doing strange things. lb = (int) Math.ceil(Math.max(0, (double) n * (double) p - (double) n * (double) e)); ub = (int) Math.floor(Math.min((double) n, (double) n * (double) p + (double) n * (double) e)); for (int k = lb; k <= ub; k++) actual += Combinatorics.bernoulli(n, p, k); //disp.appendText(String.valueOf(n) + " " //+ String.valueOf(1 - actual) + " " //+ String.valueOf(cheb) + "\n"); actual = round(1 - actual, .0001f); if (actual < 0) actual = 0; if (cheb < 0) cheb = 0; cheb = round(cheb, .0001f); size[n / 50].setText(String.valueOf(n)); real[n / 50].setText(String.valueOf(actual)); estimate[n / 50].setText(String.valueOf(cheb)); } validate(); } public float round(float num, float accuracy) { return accuracy * Math.round(num / accuracy); } }