最近项目有需求,一组数据按照概率分布随机取出一个,相当于抽奖,所以写了一个算法。
1 /** 2 * 从一组数据按照概率分布随机取出一个 3 * @param nums 4 * @return 随机生成的数据的id 5 */ 6 public static int getRandomNum(List<ModelNum> nums) { 7 List<Double> percent = new ArrayList<>(); 8 int sumWeight = 0; 9 10 //计算总权重 11 for (int i = 0; i < nums.size(); i++) { 12 sumWeight += nums.get(i).getWeight(); 13 } 14 15 for (int i = 0; i < nums.size(); i++) { 16 //计算出每个数据所占百分比,保留两位小数 17 percent.add(Double.parseDouble(stringFormat(Arith.div(String.valueOf(nums.get(i).getWeight()),String.valueOf(sumWeight))))); 18 } 19 20 //按照每个数据对应的概率分布,生成100个数据 21 List<ModelNum> list = new ArrayList<>(); 22 for (int j = 0; j < percent.size(); j++) { 23 for (int i = 0; i < 100 * percent.get(j); i++) { 24 list.add(nums.get(j)); 25 } 26 } 27 28 //产生0-99的整数值,也是list的索引 29 int index = (int) (Math.random() * 100); 30 //从生成的100个数据中,随机取出 31 int rand = list.get(index).getId(); 32 return rand; 33 }
BY LiYing