BalanceUtil 权重负载均衡工具类
需求: 现在有三个AB测试分组,比例各为 5 3 2,需要按照权重过滤得到要走的测试分组
实现
工具类 BalanceUtil
public class BalanceUtil {
int sum = 0;
int[] w;
int[] pre;
public BalanceUtil(int[] w) {
this.w = w;
pre = new int[w.length + 1];
for (int i = 1; i <= w.length; i++) {
sum += w[i - 1];
pre[i] = pre[i - 1] + w[i - 1];
}
for (int i = 0; i < pre.length; i++) {
pre[i]++;
}
// 1 3 4 6
// 0 1 4 8 14
// 1 2 5 9 15
//pre[i]+1表示 beigin = i+1, end) = pre[i+1];
}
public int pickIndex() {
//[1,sum]
int v = (int) (Math.random() * sum) + 1;
return search(v);
}
public int pickIndex(int v) {
return search(v);
}
private int search(int v) {
int l = 0;
int r = pre.length - 1;
while (l < r) {
int mid = (l + r + 1) / 2;
if (pre[mid] == v) {
return mid;
} else if (pre[mid] > v) {
r = mid - 1;
} else {
l = mid;
}
}
return l;
}
public static void main(String[] args) {
int[] arr = new int[]{
5,3, 2};
BalanceUtil balanceUtil = new BalanceUtil(arr);
//获取索引
int index = balanceUtil.pickIndex();
}
}
下一篇:
装饰者模式与动态代理的区别
