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;
    }
}
