首页 > 解决方案 > java中的加权随机选择?

问题描述

我可以在不使用外部库的情况下在 java 中执行以下操作吗?也许使用 if-else 语句?谢谢

import random

print(random.choices(['A', 'B', 'C'], [0.5, 0.3, 0.2]))

标签: javarandom

解决方案


当然。所需工具有:

  • 的一个实例java.util.Random
  • 调用它的nextDouble方法。

该算法类似于:

  • 首先一次性计算增量权重。在你的例子中,那将是[0.5, 0.8, 1.0].
  • 将 的输出nextDouble与最终权重相乘(这里最终权重为 1.0,因此不需要。当然,乘以 1.0 并没有什么坏处)。
  • 遍历增量权重并检查您拥有的随机数是否小于它。如果是,那是你的选择。

例子:

public class WeightedList {
    private final char[] choices;
    private final double[] weights;
    private final Random rnd = new Random();

    public WeightedList(char[] choices, double[] weights) {
        if (choices.length != weights.length) throw new IllegalArgumentException();
        this.choices = Arrays.copyOf(choices);
        this.weights = new double[weights.length];
        double s = 0.0;
        for (int i = 0; i < weights.length; i++) {
            this.weights[i] = (s += weights[i]);
        }
    }

    public char get() {
        double v = rnd.nextDouble() * weights[weights.length - 1];
        for (int i = 0; i < weights.length - 1; i++) {
            if (v < weights[i]) return choices[i];
        }
        return weights[weights.length - 1];
    }
}

推荐阅读