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));
        }
    }
}

 

验证结果

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

Process finished with exit code 0

 




免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM