import java.util.Arrays; public class WeightALG { public static void main(String[] args) { int[] ary=new int[]{7,7,7,7,10}; for(int i=0;i<100000;i++) algoWeight(ary); } /** * 权重百分比算法 * @param orginData 计算原始数据 * @return 返回命中数据的索引 */ public static int algoWeight(int[] orginData) { if(orginData==null || orginData.length==0){ throw new IllegalArgumentException("orginData不能为空、并且长度不能为0"); } final int total=Arrays.stream(orginData).sum(); final double[] weights=Arrays.stream(orginData).mapToDouble((input)->(0.00D+input)/total).toArray(); double weight=Math.random(); double start=0; double end=weights[0]; for(int idx=1;idx<=weights.length;idx++) { if(start<=weight && end>weight) { return idx-1; } start=end; end=start+weights[idx]; } return -1;//如果返回-1是程序bug } }
当orgiData数据比较大的时候可以考虑使用红黑树数据结构来做。