• 权重随机算法Java实现


    权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100;

    简单实现代码如下:

    ?

    importjava.util.ArrayList;  
    importjava.util.List;  
    importjava.util.Random;  
       
    publicclass WeightRandom {  
        staticList<WeightCategory>  categorys = newArrayList<WeightCategory>();  
        privatestatic Random random = newRandom();  
           
        publicstatic void initData() {  
            WeightCategory wc1 = newWeightCategory("A",60); 
            WeightCategory wc2 = newWeightCategory("B",20); 
            WeightCategory wc3 = newWeightCategory("C",20); 
            categorys.add(wc1); 
            categorys.add(wc2); 
            categorys.add(wc3); 
        } 
       
        publicstatic 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();  
              } 
       
                 
        } 
       
    } 
       
    classWeightCategory {  
        privateString category;  
        privateInteger weight;  
           
       
        publicWeightCategory() {  
            super(); 
        } 
       
        publicWeightCategory(String category, Integer weight) {  
            super(); 
            this.setCategory(category); 
            this.setWeight(weight); 
        } 
       
       
        publicInteger getWeight() {  
            returnweight;  
        } 
       
        publicvoid setWeight(Integer weight) {  
            this.weight = weight;  
        } 
       
        publicString getCategory() {  
            returncategory;  
        } 
       
        publicvoid setCategory(String category) {  
            this.category = category;  
        } 
    }


  • 相关阅读:
    面试题:区分List中remove(int index)和remove(Object obj)
    Collection的子接口之一:List 接口
    面试题:ArrayList、LinkedList、Vector三者的异同?
    jdk 5.0 新增的foreach循环(用于遍历集合、数组)
    Iterator迭代器接口(遍历Collection的两种方式之一)
    哈希值
    Collection接口方法
    集合框架的概述
    注解(Annotation)
    System类、Math类、BigInteger与BigDecimal的使用
  • 原文地址:https://www.cnblogs.com/yan456jie/p/5369444.html
Copyright © 2020-2023  润新知