该算法可以均匀的按照权重轮询。
轮询策略:
请求序号 | 选中之前权值 | 选中 | 选中之后
----|------|----
1 | 4,2,1 | a|-3,2,1
2 | 1,4,2 | b|1,-3,2
3| 5,-1,3|a|-2,-1,3
4|2,1,4|c|2,1,-3
5|6,3,-2|a|-1,3,-2
6|3,5,-1|b|3,-2,-1
7|7,0,0|a|0,0,0
示例:比如第一次请求,选权值最高的a(非常显然),选完之后,命中者的权值减掉权值和(4+2+1=7),得到-3,2,1, 然后再加上原权值(4,2,1),变成(1,4,2)。
第二次请求,选权值最高的b(非常显然),选完之后,命中者的权值减掉原权值和(4+2+1=7),得到1,-3,2, 然后再加上原权值(4,2,1),变成(5,-1,3)。
代码实现如下:
public static void main(String[] args) {
int oa = 4;
int ob = 2;
int oc = 1;
int sum = oa + ob + oc;
int a = 4;
int b = 2;
int c = 1;
int ca = 0;
int cb = 0;
int cc = 0;
for (int i = 0; i < 80; i++) {
if (a > b) {
if (a > c) {
ca++;
a = a - sum;
a += oa;
b += ob;
c += oc;
} else {
cc++;
c = c - sum;
a += oa;
b += ob;
c += oc;
}
} else {
if (b > c) {
cb++;
b = b - sum;
a += oa;
b += ob;
c += oc;
} else {
cc++;
c = c - sum;
a += oa;
b += ob;
c += oc;
}
}
}
System.out.println("ca:" + ca);
System.out.println("cb:" + cb);
System.out.println("cc:" + cc);
}
参考自:https://www.jianshu.com/p/f941c9b46748