權重值設置問題

一個簡單的方法根據權重,按照比例隨機顯示對應的廣告, 權重值越大,概率越大。
比如有個廣告list,廣告屬性有id,weight,寫個通用方法來根據權重顯示廣告id:
public class TEST {
 
    public static void main(String[] args) {
        List<Ad> list = new ArrayList<Ad>();
        list.add(new Ad(1,5));
        list.add(new Ad(2,10));
        list.add(new Ad(3,20));
        list.add(new Ad(4,30));
        list.add(new Ad(5,35));
        ComTest com = new ComTest();
        Collections.sort(list,com); //對list中廣告的權重要先排序,否則無法將隨機數順序安置到對應的區間
 
        int id1=0;
        int id2=0;
        int id3=0;
        int id4=0;
        int id5=0;
        for (int i = 0; i < 100; i++) {
            int id = getAd(list);
            if(id==1) id1++;
            if(id==2) id2++;
            if(id==3) id3++;
            if(id==4) id4++;
            if(id==5) id5++;
        } //
        System.out.println("12345:"+id1+"|"+id2+"|"+id3+"|"+id4+"|"+id5); //統計各id出現的次數
    }
    public static int getAd(List<Ad> list){  //根據權重返回對應id的方法
        int sumWeight = 0//得到總權重
        for(Ad ad :list){
            sumWeight+=ad.getWeight();
        }
        Random rand = new Random();
        int x = rand.nextInt(sumWeight) + 1//生成隨機數
        int start = 0int end = 0;
        for(int i=1;i<list.size();i++){
            //計算各個權重對應的起止數值段
            if(i==1){
                start = list.get(i-1).getWeight();
                end = list.get(i-1).getWeight()+list.get(i).getWeight();
            }else{
                start = end;
                end = start+list.get(i).getWeight();
            }
            //根據隨機數落入的範圍返回對應機率的廣告id
            if(x>start && x<=end){
                return list.get(i).getId();
            }else if(x<=start){
                return list.get(i-1).getId();
            }else{
                continue;
            }
        }
        return 0;
    }
}
         
class Ad{
     
    public Ad(int id,int weight){
        this.id = id;
        this.weight = weight;
    }
    int id;
    int weight;
     
    public int getId() {
        return id;
    }
     
    public void setId(int id) {
        this.id = id;
    }
     
    public int getWeight() {
        return weight;
    }
     
    public void setWeight(int weight) {
        this.weight = weight;
    }
     
}
發佈了25 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章