// StirlingApproximations.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 StirlingApproximations
	extends java.applet.Applet
{
	TextArea disp;		// Area to display HT
	
	Panel contp;		// Panel for user controls
	
	Label numl1;			// Controls
	TextField num1;
	Label numl2;			// Controls
	TextField num2;
	Button go;
		
	// Initialize applet
	public void init()
	{	
		numl1 = new Label("Min n =");			// Create controls
		num1 = new TextField("1", 4);
		numl2 = new Label("Max n =");			// Create controls
		num2 = new TextField("10", 4);
		go = new Button("Go");
		
		disp = new TextArea(10, 20);		// Create display area
		
		setLayout(new GridLayout(2, 1));
		add(disp);
		
		contp = new Panel();				// Set up control panel
		add(contp);
		
		contp.setLayout(new FlowLayout());
		contp.add(numl1);					
		contp.add(num1);
		contp.add(numl2);					
		contp.add(num2);
		contp.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());
        		return true;					// Generate correct number of tosses
			}
		}
		return super.handleEvent(evt);	// Handle other events as usual
	}
	
	// Calculate probabilities
    public void simulate(int min, int max)
    {
    	int fact;
    	float stir;
    	for (int i = 0; i < max - min + 1; i++) {
    		fact = 1;
    		for (int j = 1; j <= min + i; j++) {
    			fact *= j;
    		}
    		stir = (float) (Math.pow((double) (min + i), (double) (min + i)) * 
    			Math.pow(Math.E, (double) (-1 * (min + i))) *
    			Math.pow(2 * Math.PI * (double) (min + i), .5));
    		disp.appendText("n - " + String.valueOf(min + i) + "      n! - " + 
    			String.valueOf(fact) + "      approx - " + String.valueOf(stir)
    			+ "      ratio - " + String.valueOf((float) fact / stir));
    		disp.appendText("\n");
    	}
	}

}


