首页 > Java > java教程 > 正文

如何使用 NavigableMaps 在 Java 中实现加权随机选择?

Susan Sarandon
发布: 2024-11-09 22:31:02
原创
309 人浏览过

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() 方法来根据分配的动物来选择动物权重:

for (int i = 0; i < 10; i++) {
    System.out.println(rc.next());
}
登录后复制

此代码将生成一系列动物名称,并选择与其体重成比例的每种动物的概率。通过利用 NavigableMaps 和随机性的强大功能,我们可以在 Java 中有效地实现加权随机选择,从而允许基于预定义概率的有偏差的结果。

以上是如何使用 NavigableMaps 在 Java 中实现加权随机选择?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板