一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java權重隨機的實現方法

Java權重隨機的實現方法

2019-12-08 19:08shichen2014 JAVA教程

這篇文章主要介紹了Java權重隨機的實現方法,實例分析了權重隨機算法的原理與完整實現方法,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了Java權重隨機的實現方法。分享給大家供大家參考。具體分析如下:

權重隨機在項目中經常用到,所以我把它抽象到一個工具類中。

一般實現隨機權重有兩種方式:

1. 使用一個數組存放權重對應的實際目標,比如A的權重是2,B的權重是3,那么數組長度為5, 數組前兩個存放A,后三個存放B。

然后隨機一個[0-數據長度)的數字,直接取數組對應下標的值就可以了。

優點:數據結構簡單,算法高效,實現簡單

缺點:當權重值比較大同時數據又比較多的時候,會浪費內存

2. 使用區間算法,從前到后依次疊加權重,然后隨機一個[1-權重和]的數字,再用隨機的權重依次減去每個元素的權重,當第一個小于等于0的元素就是我們找元素

這里實現可以借用Arrays的binarySearch方法。

完整實例代碼點擊此處本站下載。

貼一下代碼:

WeightMeta.java:

復制代碼代碼如下:
/** 
 * 建議使用RandomUtil類創建RandomMeta對象 
 * @author wxf on 14-5-5. 
 */  
public class WeightMeta<T> {  
    private final Random ran = new Random();  
    private final T[] nodes;  
    private final int[] weights;  
    private final int maxW;  
  
    public WeightMeta(T[] nodes, int[] weights) {  
        this.nodes = nodes;  
        this.weights = weights;  
        this.maxW = weights[weights.length - 1];  
    }  
  
    /** 
     * 該方法返回權重隨機對象 
     * @return 
     */  
    public T random() {  
        int index = Arrays.binarySearch(weights, ran.nextInt(maxW) + 1);  
        if (index < 0) {  
            index = -1 - index;  
        }  
        return nodes[index];  
    }  
  
    public T random(int ranInt) {  
        if (ranInt > maxW) {  
            ranInt = maxW;  
        } else if(ranInt < 0){  
            ranInt = 1;  
        } else {  
            ranInt ++;  
        }  
        int index = Arrays.binarySearch(weights, ranInt);  
        if (index < 0) {  
            index = -1 - index;  
        }  
        return nodes[index];  
    }  
  
    @Override  
    public String toString() {  
        StringBuilder l1 = new StringBuilder();  
        StringBuilder l2 = new StringBuilder("[random]\t");  
        StringBuilder l3 = new StringBuilder("[node]\t\t");  
        l1.append(this.getClass().getName()).append(":").append(this.hashCode()).append(":\n").append("[index]\t\t");  
        for (int i = 0; i < weights.length; i++) {  
            l1.append(i).append("\t");  
            l2.append(weights[i]).append("\t");  
            l3.append(nodes[i]).append("\t");  
        }  
        l1.append("\n");  
        l2.append("\n");  
        l3.append("\n");  
        return l1.append(l2).append(l3).toString();  
    }  
}

 

RandomUtil.java:

復制代碼代碼如下:
/** 
 * 隨機工具類 
 * 
 * 使用權重的集合Map構建隨機元數據對象 
 * 
 * 比如: 
 * 我們有3個url地址,他們的權重分別為1,2,3現在我們利用RandomUtil來根據權重隨機獲取url: 
 * 
 * <p><blockquote><pre> 
 * 
 * map.put(url1, 1); 
 * map.put(url2, 2); 
 * map.put(url3, 3); 
 * RandomMeta<String, Integer> md = RandomUtil.buildWeightMeta(map); 
 * String weightRandomUrl = md.random(); 
 * 
 * </pre></blockquote><p> 
 * 
 * @author wxf on 14-5-5. 
 */  
public class RandomUtil {  
    public static <T> WeightMeta<T> buildWeightMeta(final Map<T, Integer> weightMap) {  
        final int size = weightMap.size();  
        Object[] nodes = new Object[size];  
        int[] weights = new int[size];  
        int index = 0;  
        int weightAdder = 0;  
        for (Map.Entry<T, Integer> each : weightMap.entrySet()) {  
            nodes[index] = each.getKey();  
            weights[index++] = (weightAdder = weightAdder + each.getValue());  
        }  
        return new WeightMeta<T>((T[]) nodes, weights);  
    }  
}

 

希望本文所述對大家的Java程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费yjsp妖精com | 9久热这里只有精品视频在线观看 | 女人和拘做受全过程免费 | 国产探花在线视频 | 日韩一区二区不卡 | 激情小说欧美图片 | 欧美xxoo做爰猛烈视频 | 欧美极品摘花过程 | 国产福利专区精品视频 | 五月婷婷在线免费观看 | 女bbbbxxxx视频 | xxxxxx性受 | 欧美亚洲韩国 | 情趣内衣在线观看 | 久久精品无码人妻无码AV蜜臀 | 国产精品免费_区二区三区观看 | 边摸边吃奶又黄激烈视频韩国 | 免费看成人毛片日本久久 | 青青青青青操 | 精品淑女少妇AV久久免费 | 国产区综合另类亚洲欧美 | 青草国产福利视频免费观看 | 火影忍者小南裸羞羞漫画 | 日韩大片免费看 | 桃乃木香奈作品在线观看 | 欧美成人福利 | 四虎精品免费国产成人 | 色戒完整版 | 香蕉国产精品偷在线播放 | 男女xxoo做爰猛烈动态一 | 俺去啦最新官网 | 亚洲gogo人体大胆西西安徽 | 成年人黄色录像 | 日韩在线视精品在亚洲 | 4hu四虎永久网址 | 日韩在线视频在线 | 欧美同性猛男野外gay免费 | 日本无卡码一区二区三区 | 微拍秒拍99福利精品小视频 | 国产免费看视频 | 成免费视频 |