When selecting an item from a set, it's often desirable to assign different probabilities to different items. This method is known as weighted random selection.
Consider the following scenario where you have a collection of items with associated weights:
Item | Weight |
---|---|
Sword of Misery | 10 |
Shield of Happy | 5 |
Potion of Dying | 6 |
Triple-Edged Sword | 1 |
In this case, the weight represents the likelihood of selecting that item. For example, you are 10 times more likely to obtain the Sword of Misery than the Triple-Edged Sword.
To implement weighted random selection in Java, we can employ a NavigableMap:
import java.util.NavigableMap; import java.util.Random; import java.util.TreeMap; public class RandomCollection<E> { private final NavigableMap<Double, E> map = new TreeMap<>(); private final Random random; private double total = 0; public RandomCollection() { this(new Random()); } public RandomCollection(Random random) { this.random = random; } public RandomCollection<E> add(double weight, E result) { if (weight <= 0) return this; total += weight; map.put(total, result); return this; } public E next() { double value = random.nextDouble() * total; return map.higherEntry(value).getValue(); } }
Usage:
RandomCollection<String> rc = new RandomCollection<>() .add(40, "dog").add(35, "cat").add(25, "horse"); for (int i = 0; i < 10; i++) { System.out.println(rc.next()); }
This code demonstrates how to add items with specific weights to the collection and then select random items based on their assigned probabilities.
The above is the detailed content of How to Implement Weighted Random Selection in Java?. For more information, please follow other related articles on the PHP Chinese website!