最近项目有需求,一组数据按照概率分布随机取出一个,相当于抽奖,所以写了一个算法。

 

 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

相关文章:

  • 2021-09-28
  • 2022-02-09
  • 2021-12-04
  • 2021-07-28
  • 2022-02-23
  • 2021-12-01
  • 2021-10-12
猜你喜欢
  • 2021-08-24
  • 2022-12-23
  • 2021-12-05
  • 2022-12-23
  • 2022-12-23
  • 2022-01-14
相关资源
相似解决方案