import java.math.BigDecimal; 
import java.math.RoundingMode; 
import java.text.DecimalFormat; 
import java.util.Random; 
  
public class DiceRollSimulator { 
      
    public static String simulate(int numberOfDice, int numberOfTrials) 
    { 
        // return nothing if there are no dice and/or no trials 
        if (numberOfDice < 1 || numberOfTrials < 1) return ""; 
  
        // number of trials 
        BigDecimal trials = new BigDecimal(String.valueOf(numberOfTrials)); 
          
        // array to keep track of roll count 
        BigDecimal[] rolls = new BigDecimal[numberOfDice * 6 + 1]; 
        for (int i = 0; i < rolls.length; i++) rolls[i] = BigDecimal.ZERO; // intialize BigDecimal array 
          
        for (int i = 0; i < trials.doubleValue(); i++) 
        { 
            // roll the die/dice and count the sum 
            int rollSum = 0; 
            for (int j = 0; j < numberOfDice; j++) rollSum += randomInt(1, 6); 
              
            // add 1 to the roll counter array for which sum was rolled 
            rolls[rollSum] = new BigDecimal(String.valueOf(rolls[rollSum].intValue() + 1)); 
        } 
          
        DecimalFormat df = new DecimalFormat("#.#####"); 
        String re = ""; // return string 
          
        // add the roll percentages to the return string 
        for (int i = numberOfDice; i < rolls.length; i++) 
        { 
            // number of spaces after showing what sum it is 
            String spacing = createStrings(" ", 5 - String.valueOf(i).length()); 
              
            // number of times this sum was rolled 
            int rollNumber = rolls[i].intValue(); 
              
            // roll percentage in respect to the number of trials 
            String percentage = df.format((rolls[i].divide(trials, 5, RoundingMode.HALF_EVEN)).multiply(new BigDecimal("100"))) + "%"; 
              
            // spacing after the roll percentage 
            String spacing2 = createStrings(" ", 10 - percentage.length()); 
              
            // if the percentage is less than 10 (align the percentage place values) 
            if (Double.parseDouble(percentage.substring(0, percentage.length() - 1)) < 10)  
            { 
                spacing += " "; // move the percentage over 1 space 
                spacing2 = spacing2.substring(0, spacing2.length() - 1); // move the roll count back one space 
            } 
            // put it all together and add it to the return string 
            re += (i + ":" + spacing + percentage + spacing2 + "--> (" + rollNumber + " rolls)\n"); 
        } 
        return re; 
    } 
      
    /* returns a string repeated int number of times */
    public static String createStrings(String str, int numberOfStrings) 
    { 
        String re = ""; 
        for (int i = 0; i < numberOfStrings; i++) re += str; 
        return re; 
    } 
      
    /* returns random number between min (inclusive) and max (inclusive) */
    public static int randomInt(int min, int max) { 
        return min + (int)(Math.random() * ((max - min) + 1)); 
    } 
          
    public static int randInt(int min, int max) { 
        return new Random().nextInt((max - min) + 1) + min; 
    } 
}
DOWNLOAD

             Created: January 22, 2014
Completed in full by: Michael Yaworski