算法设计思路如下:
1、将一组加权值在数轴上分布每个加权值表示数轴上的一段如权值(10,20,30,40)
如下图所示,表示了4个权值在数轴上的分布,分布顺序任意
2、所有权值的总和表示随机的范围,采用JAVA RANDOM 计算随机值 ,本例中范围为100
Random random = new Random(); int point = random.nextInt(100);
3、获取随机值所对应的权值标签
按照区间 [lower,upper) 分段检查 随机值落在哪个区间内,随机值所落的区间即为命中的权重标签
如本例中随机值为 80 则 命中 权重 【40】
4、算法代码
private Long getVersion(TreeMap<Long,Integer> gammaMap){
Long version = null;
Random random = new Random();
//get a point in [0,100)
int randomPoint = random.nextInt(100);
int lower = 0,upper = 0;
for(Map.Entry<Long, Integer> entry : gammaMap.entrySet()){
Long entryVersion = entry.getKey();
int gamma = entry.getValue() == null ? 0 : entry.getValue().intValue();
lower = upper;
upper += gamma;
if(randomPoint >= lower && randomPoint < upper){
version = entryVersion;
break;
}
}
logger.info("==>random:{},version:{}",randomPoint,version);
return version;
}
5、算法测试
1000次调用 权重分布
[101,184,280,435]
6、总结
算法的可靠性取决于随机算法的随机性,按测试结论基本实现了按权重的均衡