Home >Java >javaTutorial >How to Implement Weighted Random Selection in Java?

How to Implement Weighted Random Selection in Java?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-08 08:05:01391browse

How to Implement Weighted Random Selection in Java?

Weighted Random Selection in Java

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn