Java实现权重选择器
BG:今天写代码,我们接入了多家的地图解析功能,选择了一家便宜的入证。其他家也有免费额度,别浪费嘛。
于是我就写一下权重选择器,根据配置好的权重,去调用不同的地图解析引擎。
思路
本质就是设置和获取。
但是,怎么设置怎么获取,这个是有学问的。
-
首先是添加内容,添加内容的时候,应当是携带权重的。
- 假设我们权重为整数,总的权重则为所有内容的权重相加;
- 所以我们设置的时候,就有内容,权重。
- 对权重位置进行处理,比如说10,30,40。那么总的权重为80,第一个为0~10,第二个为10~40,第三个为40~80;
-
其次是获取,获取的话,我们根据权重来计算应该把谁返回:
- 如果没有,那只能返回空了
- 如果只有1个,那么直接返回
- 如果有2个以上,就要计算权重
- 生成一个随机数,0~总权重之间;
- 根据这个随机数选择出对应的内容;
- 理论上来说,权重越大,占的范围越大,根据这个随机数去选择出来就可以了。
代码实现
public class WeightedRandomSelector<T> {
//保存内容
private List<WeightedElement<T>> elements;
public WeightedRandomSelector() {
this.elements = new ArrayList<>();
this.totalWeight = 0;
}
//总的权重
private int totalWeight;
public void addElement(T value, int weight) {
elements.add(new WeightedElement<>(value, this.totalWeight, this.totalWeight + weight));
totalWeight += weight;
}
public T selectRandom() {
if (elements.size() == 0) {
return null;
}
if (elements.size() == 1) {
return elements.get(0).value;
}
//1~totalWeight,使用的时候,(startWeight,endWeight]
int index = new Random().nextInt(this.totalWeight) + 1;
T result = elements.get(0).value;
for (WeightedElement<T> element : elements) {
//判断位置
if (index > element.startWeight && index <= element.endWeight) {
result = element.value;
break;
}
}
return result;
}
private static class WeightedElement<T> {
final T value;
final int startWeight;
final int endWeight;
WeightedElement(T value, int startWeight, int endWeight) {
this.value = value;
this.startWeight = startWeight;
this.endWeight = endWeight;
}
}
}
就这样咯,我也没有验证过,刚写完
其他选择的思路
Java权重算法通常是指在编程中实现的一种方法,用于根据预先设定的不同元素的权重值来决定这些元素被选中的概率。这种算法确保在大量重复随机选择的过程中,每个元素被选中的次数与其权重成比例,即权重较高的元素更频繁地被选中,而权重较低的元素则较少被选中。以下是一些常见的Java权重算法实现思路和示例:
-
累加权重:
- 初始化时,计算所有元素的权重总和。
- 这个总和将作为后续随机数生成的边界值。
-
生成随机数:
- 根据总权重生成一个介于0(含)到总权重(不含)之间的随机数。
- 可使用
Math.random()
函数并适当缩放以适应权重范围。
-
遍历元素与比较:
- 从第一个元素开始,依次累加其权重值。
- 当累加值大于或等于生成的随机数时,当前元素即为所选结果,停止遍历。
- 如果没有达到条件,则继续遍历下一个元素,直至找到符合条件的元素。
应用场景
权重算法在各种场景中有广泛应用,如:
- 广告投放:根据广告的出价(权重)决定其在广告展示队列中的优先级。
- 负载均衡:在多服务器集群中,根据服务器的处理能力(权重)分配请求。
- 游戏奖励系统:根据道具或奖励的稀有度(权重)决定玩家抽取的概率。
- 推荐系统:根据物品或内容的相关度、用户喜好程度等赋予权重,用于生成个性化推荐列表。
Java权重算法的核心在于根据预设权重构建一个概率分布模型,然后利用随机数生成来模拟该分布,从而实现基于权重的随机选择。上述示例代码提供了一个基础的实现框架,可以根据具体需求进行扩展和优化。