1. 程式人生 > >java實現權重隨機演算法

java實現權重隨機演算法

權重隨機演算法在抽獎,資源排程等系統中應用還是比較廣泛的,一個簡單的按照權重來隨機的實現,權重為幾個隨機物件(分類)的命中的比例,權重設定越高命中越容易,之和可以不等於100;

import java.util.ArrayList;  
import java.util.List;  
import java.util.Random;  
   
public class WeightRandom {  
    static List<WeightCategory>  categorys = new ArrayList<WeightCategory>();  
    private static Random random = new Random();  
       
    public static void initData() {  
        WeightCategory wc1 = new WeightCategory("A",60);  
        WeightCategory wc2 = new WeightCategory("B",20);  
        WeightCategory wc3 = new WeightCategory("C",20);  
        categorys.add(wc1);  
        categorys.add(wc2);  
        categorys.add(wc3);  
    }  
   
    public static void main(String[] args) {  
          initData();  
          Integer weightSum = 0;  
          for (WeightCategory wc : categorys) {  
              weightSum += wc.getWeight();  
          }  
   
          if (weightSum <= 0) {  
           System.err.println("Error: weightSum=" + weightSum.toString());  
           return;  
          }  
          Integer n = random.nextInt(weightSum); // n in [0, weightSum)  
          Integer m = 0;  
          for (WeightCategory wc : categorys) {  
               if (m <= n && n < m + wc.getWeight()) {  
                 System.out.println("This Random Category is "+wc.getCategory());  
                 break;  
               }  
               m += wc.getWeight();  
          }  
   
             
    }  
   
}  
   
class WeightCategory {  
    private String category;  
    private Integer weight;  
       
   
    public WeightCategory() {  
        super();  
    }  
   
    public WeightCategory(String category, Integer weight) {  
        super();  
        this.setCategory(category);  
        this.setWeight(weight);  
    }  
   
   
    public Integer getWeight() {  
        return weight;  
    }  
   
    public void setWeight(Integer weight) {  
        this.weight = weight;  
    }  
   
    public String getCategory() {  
        return category;  
    }  
   
    public void setCategory(String category) {  
        this.category = category;  
    }  
}