Java 根據 權重 獲取數據 基礎 極簡 準確率高

需求:根據目標的權重,獲取目標數據;本例:根據用戶Id所佔比重,按權重隨機獲取;能夠根據實際需求,修改K的類型,獲取所需;
package sl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 需求 => 根據目標的權重,獲取目標數據;
 * 本例 => 根據用戶Id所佔比重,按權重隨機獲取;能夠根據實際需求,修改K的類型;
 * @param <K>
 * @author panguijia
 */
public class AssignRule<K> {
    /**
     *  隨機規則
     */
    public  K getRandomUserId( Map<K,Integer> rawMap){
        Map<K, List<Integer>> idMapper=new HashMap<>();
        int count=0;
        for(K k:rawMap.keySet()){
            List<Integer> numList=new ArrayList<>();
            for(int i=0;i<rawMap.get(k);i++){
                count++;
                numList.add(count);
            }
            idMapper.put(k,numList);

        }
        int max=count,min=1;
        int rand = (int) (Math.random()*(max)+min);
        for(K k:idMapper.keySet()){
            for(int v:idMapper.get(k)){
                if(v==rand){
                    return k;
                }
            }
        }
        return null;
    }

    /**
     * 驗證分配規則有效性
     * @param args
     */
    public static void main(String[] args) {
        /**
         * key target
         * val ratio
         */
        Map<Integer,Integer> rawMap=new HashMap<>();
        rawMap.put(1,1);
        rawMap.put(2,2);
        rawMap.put(3,3);
        rawMap.put(4,4);

        Map<Integer,Integer> map=new HashMap<>();
        map.put(1,0);
        map.put(2,0);
        map.put(3,0);
        map.put(4,0);
        //實例化,目標對象類型
        AssignRule<Integer> assignRule=new AssignRule<>();
        for(int i=0;i<10000000;i++){
            for(int k:map.keySet()){
                if(k==assignRule.getRandomUserId(rawMap)){
                    int v=map.get(k);
                    map.put(k,v+1);
                }
            }
        }
        for(int k:map.keySet()){
            System.out.println(k+" = "+map.get(k));
        }
    }
}

 

驗證結果java

1 = 1001348
2 = 1998783
3 = 3000873
4 = 3997947

Process finished with exit code 0
相關文章
相關標籤/搜索