[关闭]
@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;
}
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注