package org.mafagafogigante.dungeon.game; import org.mafagafogigante.dungeon.util.Percentage; import org.jetbrains.annotations.NotNull; import java.util.List; /** * Random class that encapsulates the single Random object shared by the whole application. The reason for this is that * other parts of the code should not be able to call some of Random public methods, such as setSeed. */ public class Random { private static final java.util.Random RANDOM = new java.util.Random(); /** * Simulates a random roll. * * @param chance the probability of a true result. * @return a boolean indicating if the roll was successful or not. */ public static boolean roll(Percentage chance) { return chance.toDouble() > RANDOM.nextDouble(); } /** * Simulates a random roll. * * @param chance the probability of a true result. Must be nonnegative and smaller than or equal to 1. * @return a boolean indicating if the roll was successful or not. */ public static boolean roll(double chance) { return roll(new Percentage(chance)); } /** * Returns a pseudorandom, uniformly distributed boolean. * * @return a boolean */ public static boolean nextBoolean() { return RANDOM.nextBoolean(); } /** * Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive). * * @param n the bound on the random number to be returned, must be positive * @return an int in the range [0, n) */ public static int nextInteger(int n) { return RANDOM.nextInt(n); } /** * Returns a pseudorandom, uniformly distributed int value between minimum (inclusive) and n (exclusive). * * @param n the bound on the random number to be returned, must be positive * @return an int in the range [minimum, n) */ public static int nextInteger(int minimum, int n) { if (minimum >= n) { throw new IllegalArgumentException("minimum must be less than n"); } return minimum + nextInteger(n - minimum); } /** * Selects a random element from a List. * * @param list a List object, not empty, not null * @param <T> the type of elements held in the List * @return an element of list or null */ public static <T> T select(@NotNull List<T> list) { if (list.isEmpty()) { throw new IllegalArgumentException("list is empty."); } return list.get(nextInteger(list.size())); } }