// DeadlandsStats.java

import java.io.*;
import java.util.*;

public class DeadlandsStats
{
// largest die roll I could care about
static final int BIGNUM = 40;

static final int MAXDICE = 10;

static final int NROLLS = 1000000;

public static void main(String[] args)
{
    PrintStream out = System.out,
		err = System.err;
    Random rnd = new Random();

    int[][] t;		// chance for [numdice][roll]
    int[] column;	// total for [numdice]

    err.println("Workin'");

    out.println("<html>\n");
    out.println("<head><title>Deadlands Die Stats</title></head>\n");
    out.println("<body><h1 align='center'>Deadlands Die Stats</h1>\n");

    for(int sides = 4; sides <= 12; sides += 2) {
	t = new int[MAXDICE+1][BIGNUM+1];
	column = new int[MAXDICE+1];

	// table header
	out.println("<h1>d"+sides+"</h1>\n<table>\n<tr><th><u>TN</u></th>");
	for(int numdice = 1; numdice <= MAXDICE; ++numdice) {
	    out.print("\t<th><u>"+numdice+"d"+sides+"</u></th>");
	}
	out.println("</tr>");

	out.print("<tr><th>Average:</th>");
	// number crunching
	for(int numdice = 1; numdice <= MAXDICE; ++numdice) {
	    column[numdice] = NROLLS;
	    err.print( numdice+"d"+sides+":" );  err.flush();
	    for(int i = 0; i < NROLLS; ++i) {
		int roll = 0, best = 0, die = 0;
		for(int d = 0; d < numdice; ++d) {
		    roll = 0;
		    die = 0;
		    do {
			roll += die = (int)(rnd.nextDouble() * sides) + 1;
		    } while(die == sides);	// reroll and add if maxed
		    if( roll > BIGNUM ) {
			roll = BIGNUM;
		    }
		    if( roll > best ) {
			best = roll;
		    }
		}
		++t[numdice][best];
		if( i % 14000 == 0 ) {
		    err.print('.');
		    err.flush();
		}
	    }

	    // averages
	    double avg = 0;
	    for(int roll = 1; roll <= BIGNUM; ++roll) {
		avg += t[numdice][roll] * roll;
	    }
	    out.print("\t<td>"+(avg/NROLLS)+"</td>");

	    err.println();
	}
	out.println("</tr>");

	for(int roll = 1; roll <= BIGNUM; ++roll) {
	    out.print("<tr><th>"+roll+"</th>");
	    for(int numdice = 1; numdice <= 10; ++numdice) {
		out.print("\t<td>"+(100.0*column[numdice]/NROLLS)+"%</td>");
		column[numdice] -= t[numdice][roll];
	    }
	    out.println("</tr>");
	}
	out.println("</table>\n<hr />");
    }
    out.println("</body></html>");
    err.println("Whoah!");
}

}
