最近項目有需求,一組數據按照機率分佈隨機取出一個,至關於抽獎,因此寫了一個算法。算法
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 LiYingdom