class="java">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数据比较大的时候可以考虑使用红黑树数据结构来做。