@kevinZheng
2015-01-05T05:57:15.000000Z
字数 730
阅读 2493
编程
随机数
权重
/**
* @作者 郑瑞召
* @日期时间 2015年1月5日 下午12:50:16
* @方法 random
* @描述 根据列表和权重随机抽取
* @函数返回类型 List<T>
*/
public static <T> List<T> random(List<T> source, int[] percents, int count) {
List<T> result = new ArrayList<T>();
if (source != null&&source.size()>0&&percents!=null) {
List<T> temp = new ArrayList<T>(source);
int minSize = Math.min(source.size(), count);//结果数组大小
int random_range =0;//随机范围
int tmp_percents[]=percents.clone();
for(int p:tmp_percents){
random_range+=p;
}
for (int i = 0; i < minSize; i++) {
int random = new SecureRandom().nextInt(random_range);
int sum=0;
for(int j=0;j<tmp_percents.length;j++){
sum+=tmp_percents[j];
//根据干预比例累加确定得到随机到的元素
if(sum>=random+1){
result.add(temp.get(j));//结果组装
random_range-=tmp_percents[j];//随机范围调整
tmp_percents[j]=0;//下次跳过抽中的元素
break;
}
}
}
}
return result;
}