ホームページ > Java > &#&チュートリアル > NavigableMaps を使用して Java で重み付きランダム選択を実装するにはどうすればよいですか?

NavigableMaps を使用して Java で重み付きランダム選択を実装するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-09 22:31:02
オリジナル
374 人が閲覧しました

How can I implement weighted random selection in Java using NavigableMaps?

Java でのランダムな重み付き選択

プログラミングの分野では、重み付きランダム選択とは、次の確率が得られるセットから項目を選択することを指します。選択は、関連する重みに直接リンクされます。この手法は、確率に基づいた偏った選択が必要なシミュレーションや宝くじなどのシナリオに応用できます。

Java の重み付きランダム選択の問題に対処するために、NavigableMap の概念を導入します。このデータ構造により、重みを対応する項目にマッピングし、マップを昇順で移動することができます。乱数ジェネレーターの助けを借りて、重量に比例する確率でアイテムを効率的に選択できます。

さまざまな確率で動物を選択する例を考えてみましょう:

  • 犬: 40 %
  • 猫: 35%
  • 馬: 25%

NavigableMap を使用して重み付けされたランダム選択を実装するには、次のクラスを作成できます。

public class RandomCollection<E> {
    //NavigableMap to store weights and corresponding items
    private final NavigableMap<Double, E> map = new TreeMap<>();
    //Random instance for generating random weights
    private final Random random;
    //Total sum of weights
    private double total = 0;

    public RandomCollection() {
        this(new Random());
    }

    public RandomCollection(Random random) {
        this.random = random;
    }

    //Add an item to the collection with its weight
    public RandomCollection<E> add(double weight, E result) {
        if (weight <= 0) return this;
        total += weight;
        map.put(total, result);
        return this;
    }

    //Select a random item based on weights
    public E next() {
        double value = random.nextDouble() * total;
        return map.higherEntry(value).getValue();
    }
}
ログイン後にコピー

実証するために、RandomCollection を作成して動物の重みを設定してみましょう。

RandomCollection<String> rc = new RandomCollection<>();
rc.add(40, "dog")
  .add(35, "cat")
  .add(25, "horse");
ログイン後にコピー

これで、 next() メソッドを繰り返し呼び出して、割り当てられた動物に基づいて動物を選択できます。 weights:

for (int i = 0; i < 10; i++) {
    System.out.println(rc.next());
}
ログイン後にコピー

このコードは、体重に比例して各動物を選択する確率で動物の名前のシーケンスを生成します。 NavigableMap とランダム性の力を利用することで、Java で加重ランダム選択を効果的に実装でき、事前定義された確率に基づいて偏った結果を可能にします。

以上がNavigableMaps を使用して Java で重み付きランダム選択を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート