package test; public class DiceTally { private final int minimum; private static final int numberOfDice = 2; private static final int numberOfSides = 6; private static final int minimumRoll = numberOfDice; private static final int numberofCombinations = numberOfDice * numberOfSides - minimumRoll + 1; private final int[] tallies = new int[numberofCombinations]; private int numberOfTosses; public DiceTally(int min) { minimum = min; } public void tallyAndReport() { clearState(); calculateTallies(); report(); } private void clearState() { clearTallies(); clearTossCount(); } private void clearTallies() { for (int i = 0; i < numberofCombinations; i++) { setTally(i, 0); } } private void clearTossCount() { numberOfTosses = 0; } private void calculateTallies() { while (!isDoneTallying()) { calculateTally(); incrementTossCount(); } } private void incrementTossCount() { numberOfTosses++; } private boolean isDoneTallying() { return getMinimumTally() >= minimum; } private int getMinimumTally() { int min = Integer.MAX_VALUE; for (int i = 0; i < numberofCombinations; i++) { min = Math.min(min, getTally(i)); } return min; } private void calculateTally() { incrementTally(convertDiceRollToIndex(rollDice())); } private int rollDice() { int sum = 0; for (int i = 0; i < numberOfDice; i++) { sum += rollDie(); } return sum; } private int rollDie() { return 1 + (int) (Math.random() * numberOfSides); } private int convertDiceRollToIndex(int roll) { return roll - minimumRoll; } private void incrementTally(int index) { setTally(index, getTally(index) + 1); } private int getTally(int index) { return tallies[index]; } private void setTally(int index, int value) { tallies[index] = value; } private void report() { for (int i = 0; i < numberofCombinations; i++) { reportCombination(i); } reportTossCount(); } private void reportCombination(int index) { System.out.println(convertIndexToDiceRoll(index) + " " + getTally(index)); } private void reportTossCount() { System.out.println("toss count: " + numberOfTosses); } private int convertIndexToDiceRoll(int index) { return index + minimumRoll; } }