// TwoArm.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 TwoArm extends java.applet.Applet implements Runnable { Float[] xc1; Float[] yc1; Float[] xc2; Float[] yc2; int[] win, lose; float[] p; float[] expected; TextArea ta; DoubleLineGraph dlg; Label numl1, numl2; TextField num1, num2; Choice c; Button go; Panel graphArea; Panel controls; GridBagLayout gbl; GridBagConstraints cc; JRandom myRand; Thread runner; boolean isrunning; // Set up all controls and put them in the window public void init() { numl1 = new Label("p(m1) ="); // Create controls num1 = new TextField(".4", 4); numl2 = new Label("p(m2) ="); // Create controls num2 = new TextField(".6", 4); c = new Choice(); c.addItem("Play best"); c.addItem("Play winner"); go = new Button("Simulate"); graphArea = new Panel(); // Set up window controls = new Panel(); setLayout(new BorderLayout(5, 5)); 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 = 2; gbl.setConstraints(numl2, cc); controls.add(numl2); cc.gridx = 3; gbl.setConstraints(num2, cc); controls.add(num2); cc.gridy = 1; cc.gridx = 0; cc.gridwidth = 4; gbl.setConstraints(c, cc); controls.add(c); cc.gridy = 2; cc.gridx = 0; cc.gridwidth = 4; gbl.setConstraints(go, cc); controls.add(go); ta = new TextArea(15, 20); dlg = new DoubleLineGraph(); add("Center", graphArea); graphArea.setLayout(new GridLayout(1, 2)); graphArea.add(ta); graphArea.add(dlg); add("South", controls); myRand = new JRandom(); } // Beta density public float beta(int a, int b, float x) { return (float) (Math.pow((double) x, (double) (a - 1)) * Math.pow((double) (1 - x), (double) (b - 1)) / beta(a, b)); } public float beta(int a, int b) { return 1f / (Combinatorics.choose(a + b - 1, a - 1) * b); } // Start running a thread public void start() { if (runner == null) { runner = new Thread(this); runner.start(); isrunning = true; } } // Stop the thread public void stop() { if (runner != null) { runner.stop(); runner = null; isrunning = false; } } // Do things public void run() { while (true) { float p1 = Float.valueOf(num1.getText()).floatValue(); float p2 = Float.valueOf(num2.getText()).floatValue(); int state = c.getSelectedIndex(); long time; int machine = 0; win = new int[2]; win[0] = 0; win[1] = 0; lose = new int[2]; lose[0] = 0; lose[1] = 0; p = new float[2]; p[0] = p1; p[1] = p2; expected = new float[2]; ta.appendText("Machine Result\n\n"); if (state == 0) { // Play best machine for (int i = 0; i < 10; i++) { ta.appendText(" " + String.valueOf(machine + 1) + " "); if (myRand.nextFloat(0, 1) < p[machine]) { win[machine]++; ta.appendText("W\n"); } else { lose[machine]++; ta.appendText("L\n"); } expected[0] = (float) (win[0] + 1) / (float) (win[0] + lose[0] + 2); expected[1] = (float) (win[1] + 1) / (float) (win[1] + lose[1] + 2); if (expected[0] >= expected[1]) machine = 0; else machine = 1; setArrays(); graphArea.remove(dlg); dlg = new DoubleLineGraph(xc1, yc1, xc2, yc2); // Create new Double... graphArea.add(dlg); validate(); graphArea.repaint(); validate(); time = System.currentTimeMillis(); while (System.currentTimeMillis() < time + 3000) { // wait 3 seconds } } } else { for (int i = 0; i < 10; i++) { // Play the winner ta.appendText(" " + String.valueOf(machine + 1) + " "); if (myRand.nextFloat(0, 1) < p[machine]) { win[machine]++; ta.appendText("W\n"); } else { lose[machine]++; ta.appendText("L\n"); machine = 1 - machine; } setArrays(); graphArea.remove(dlg); dlg = new DoubleLineGraph(xc1, yc1, xc2, yc2); // Create new Double... graphArea.add(dlg); validate(); graphArea.repaint(); validate(); time = System.currentTimeMillis(); while (System.currentTimeMillis() < time + 3000) { // 3 second delay } } } isrunning = false; runner.suspend(); } } public void setArrays() { xc1 = new Float[26]; yc1 = new Float[26]; xc2 = new Float[26]; yc2 = new Float[26]; for (int i = 0; i < 26; i++) { xc1[i] = new Float((float) i * .04f); xc2[i] = new Float((float) i * .04f); yc1[i] = new Float(beta(win[0] + 1, lose[0] + 1, (float) i * .04f)); yc2[i] = new Float(beta(win[1] + 1, lose[1] + 1, (float) i * .04f)); } } // 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 { ta.setText(""); // Reset output window runner.resume(); isrunning = true; return true; // Generate correct number of tosses } } return super.handleEvent(evt); // Handle other events as usual } }