java random chance
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
public class RandomChance {
private final Map<?, Double> map;
private final ThreadLocalRandom random = ThreadLocalRandom.current();
/**
*
* @param map This map can contain any object as the key and must contain a double as the chance for that key to be chosen
*/
public RandomChance(Map<?, Double> map) {
this.map = map;
}
/**
* @param input is the double you wish to check
* @param first is the first double that the input must be between
* @param second is the second double the input needs to be between
* @return will return true if input is between first and second
*/
private boolean isBetween(double input, double first, double second) {
return input <= Math.max(first, second) && input >= Math.min(first, second);
}
/**
*
* @return will loop through the map passed into the constructor and randomly pick a value based on the chance provided
*/
public Object get() {
double total = map.values().stream().mapToDouble(e -> e).sum();
double placeHolder = 0.0;
double randomNumber = random.nextDouble(total);
for (Object obj : map.keySet()) {
double upperBound = placeHolder + map.get(obj);
if (isBetween(randomNumber, placeHolder, upperBound)) {
return obj;
} else {
placeHolder = upperBound;
}
}
return null;
}
}