亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java權(quán)重隨機(jī)的實(shí)現(xiàn)方法

 更新時(shí)間:2015年01月13日 09:28:56   投稿:shichen2014  
這篇文章主要介紹了Java權(quán)重隨機(jī)的實(shí)現(xiàn)方法,實(shí)例分析了權(quán)重隨機(jī)算法的原理與完整實(shí)現(xiàn)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了Java權(quán)重隨機(jī)的實(shí)現(xiàn)方法。分享給大家供大家參考。具體分析如下:

權(quán)重隨機(jī)在項(xiàng)目中經(jīng)常用到,所以我把它抽象到一個(gè)工具類中。

一般實(shí)現(xiàn)隨機(jī)權(quán)重有兩種方式:

1. 使用一個(gè)數(shù)組存放權(quán)重對(duì)應(yīng)的實(shí)際目標(biāo),比如A的權(quán)重是2,B的權(quán)重是3,那么數(shù)組長度為5, 數(shù)組前兩個(gè)存放A,后三個(gè)存放B。

然后隨機(jī)一個(gè)[0-數(shù)據(jù)長度)的數(shù)字,直接取數(shù)組對(duì)應(yīng)下標(biāo)的值就可以了。

優(yōu)點(diǎn):數(shù)據(jù)結(jié)構(gòu)簡單,算法高效,實(shí)現(xiàn)簡單

缺點(diǎn):當(dāng)權(quán)重值比較大同時(shí)數(shù)據(jù)又比較多的時(shí)候,會(huì)浪費(fèi)內(nèi)存

2. 使用區(qū)間算法,從前到后依次疊加權(quán)重,然后隨機(jī)一個(gè)[1-權(quán)重和]的數(shù)字,再用隨機(jī)的權(quán)重依次減去每個(gè)元素的權(quán)重,當(dāng)?shù)谝粋€(gè)小于等于0的元素就是我們找元素

這里實(shí)現(xiàn)可以借用Arrays的binarySearch方法。

完整實(shí)例代碼點(diǎn)擊此處本站下載。

貼一下代碼:

WeightMeta.java:

復(fù)制代碼 代碼如下:
/**
 * 建議使用RandomUtil類創(chuàng)建RandomMeta對(duì)象
 * @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]; 
    } 
 
    /**
     * 該方法返回權(quán)重隨機(jī)對(duì)象
     * @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:

復(fù)制代碼 代碼如下:
/**
 * 隨機(jī)工具類
 *
 * 使用權(quán)重的集合Map構(gòu)建隨機(jī)元數(shù)據(jù)對(duì)象
 *
 * 比如:
 * 我們有3個(gè)url地址,他們的權(quán)重分別為1,2,3現(xiàn)在我們利用RandomUtil來根據(jù)權(quán)重隨機(jī)獲取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); 
    } 
}

希望本文所述對(duì)大家的Java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java Struts圖片上傳至指定文件夾并顯示圖片功能

    Java Struts圖片上傳至指定文件夾并顯示圖片功能

    這篇文章主要介紹了Java Struts圖片上傳至指定文件夾并顯示圖片功能,需要的朋友可以參考下
    2017-08-08
  • jdk21環(huán)境配置詳細(xì)步驟記錄

    jdk21環(huán)境配置詳細(xì)步驟記錄

    JDK是整個(gè)Java開發(fā)的核心,它包含了Java的運(yùn)行環(huán)境和Java工具,這篇文章主要給大家介紹了關(guān)于jdk21環(huán)境配置的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java如何使用SSLContext請(qǐng)求https鏈接

    Java如何使用SSLContext請(qǐng)求https鏈接

    這篇文章主要介紹了Java如何使用SSLContext請(qǐng)求https鏈接問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 深入淺出講解Spring框架中依賴注入與控制反轉(zhuǎn)及應(yīng)用

    深入淺出講解Spring框架中依賴注入與控制反轉(zhuǎn)及應(yīng)用

    依賴注入(Dependency?Injection)和控制反轉(zhuǎn)(Inversion?of?Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色(可能是一個(gè)Java實(shí)例,調(diào)用者)需要另一個(gè)角色(另一個(gè)Java實(shí)例,被調(diào)用者)的協(xié)助時(shí),在?傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例
    2022-03-03
  • 冒泡排序的原理及java代碼實(shí)現(xiàn)

    冒泡排序的原理及java代碼實(shí)現(xiàn)

    冒泡排序法:關(guān)鍵字較小的記錄好比氣泡逐趟上浮,關(guān)鍵字較大的記錄好比石塊下沉,每趟有一塊最大的石塊沉底。算法本質(zhì):(最大值是關(guān)鍵點(diǎn),肯定放到最后了,如此循環(huán))每次都從第一位向后滾動(dòng)比較,使最大值沉底,最小值上升一次,最后一位向前推進(jìn)
    2016-02-02
  • SpringMVC響應(yīng)處理詳細(xì)解讀

    SpringMVC響應(yīng)處理詳細(xì)解讀

    Spring?MVC?是?Spring?提供的一個(gè)基于?MVC?設(shè)計(jì)模式的輕量級(jí)?Web?開發(fā)框架,本質(zhì)上相當(dāng)于?Servlet,Spring?MVC?角色劃分清晰,分工明細(xì),本章來講解SpringMVC數(shù)據(jù)響應(yīng)
    2022-07-07
  • 淺談Java中GuavaCache返回Null的注意事項(xiàng)

    淺談Java中GuavaCache返回Null的注意事項(xiàng)

    Guava在實(shí)際的Java后端項(xiàng)目中應(yīng)用的場(chǎng)景還是比較多的,比如限流,緩存,容器操作之類的,本文主要介紹了GuavaCache返回Null的注意事項(xiàng),感興趣的可以了解一下
    2021-10-10
  • 詳解Java從后臺(tái)重定向(redirect)到另一個(gè)項(xiàng)目的方法

    詳解Java從后臺(tái)重定向(redirect)到另一個(gè)項(xiàng)目的方法

    這篇文章主要介紹了詳解Java從后臺(tái)重定向(redirect)到另一個(gè)項(xiàng)目的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • SpringMvc定制化深入探究原理

    SpringMvc定制化深入探究原理

    SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦,這篇文章主要介紹了SpringMvc定制化原理
    2022-10-10
  • Java實(shí)現(xiàn)雪花算法的原理

    Java實(shí)現(xiàn)雪花算法的原理

    這篇文章主要介紹了Java實(shí)現(xiàn)雪花算法的原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評(píng)論