セットから項目を選択するとき、異なる項目に異なる確率を割り当てることが望ましいことがよくあります。この方法は、重み付きランダム選択として知られています。
関連付けられた重みを持つアイテムのコレクションがある次のシナリオを考えてみましょう:
Item | Weight |
---|---|
Sword of Misery | 10 |
Shield of Happy | 5 |
Potion of Dying | 6 |
Triple-Edged Sword | 1 |
この場合、重みは選択の可能性を表します。そのアイテム。たとえば、Sword of Misery を入手できる可能性は Triple-Edged Sword よりも 10 倍高くなります。
Java で重み付きランダム選択を実装するには、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(); } }
使用法:
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()); }
このコードは、特定の重みを持つ項目をコレクションに追加する方法と、次に、割り当てられた確率に基づいてランダムなアイテムを選択します。
以上がJava で加重ランダム選択を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。