package pl.shockah; import java.util.*; import org.apache.commons.lang3.tuple.ImmutablePair; public class WeightedRandom<T> { protected LinkedList<ImmutablePair<T,Double>> list = new LinkedList<ImmutablePair<T,Double>>(); protected final Random rnd; public WeightedRandom() { rnd = new Random(); } public WeightedRandom(long seed) { this(); rnd.setSeed(seed); } public void add(T element, double weight) { list.add(new ImmutablePair<T,Double>(element,weight)); } public void remove(T element) { Iterator<ImmutablePair<T,Double>> iterator = list.iterator(); while (iterator.hasNext()) if (iterator.next().getLeft().equals(element)) iterator.remove(); } public T get() { double r = rnd.nextDouble(), t = 0d; for (ImmutablePair<T,Double> pair : list) t += pair.getRight(); r *= t; for (ImmutablePair<T,Double> pair : list) { if (r > pair.getRight()) r -= pair.getRight(); else return pair.getLeft(); } return null; } }