java - java中的加权随机选择?
问题描述
我可以在不使用外部库的情况下在 java 中执行以下操作吗?也许使用 if-else 语句?谢谢
import random
print(random.choices(['A', 'B', 'C'], [0.5, 0.3, 0.2]))
解决方案
当然。所需工具有:
- 的一个实例
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];
}
}
推荐阅读
- android - 将 google 脚本中的文本设置为 edittext
- apache-spark - 如何在读取前根据定义的模式读取 pyspark 中的镶木地板文件?
- javascript - 从 API 获取数据后打印变量为空,然后打印填充的值
- angular - 无法解析所有参数+错误+服务单元测试
- javascript - 反应功能和类组件是否呈现不同?
- angular - 如何根据角度的api响应刷新表格
- css - 如何使用 CSS 绘制在 Bootstrap Carousel 指示器中移动的内圈?
- powerbi - CALCULATE 中的 FILTER 是否添加或修改过滤器上下文?
- terraform - 用于依赖 argumnets 的单个 terraform 模块
- python - Pythod xlrd 细胞类型