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