最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)按權(quán)重隨機數(shù)

 更新時間:2015年04月28日 10:06:29   投稿:junjie  
這篇文章主要介紹了Java實現(xiàn)按權(quán)重隨機數(shù),本文給出了提出問題、分析問題、解決問題三個步驟,需要的朋友可以參考下

一、問題定義:

問下有一個數(shù)組,這些數(shù)組中的值都有自己的權(quán)重,怎樣設(shè)計才能高效的優(yōu)先取出權(quán)重高的數(shù)??

例如:

復(fù)制代碼 代碼如下:

權(quán)重: 8  2  11  79
權(quán)重返回的值: 0  1  2   3

二、分析問題:

思路一:創(chuàng)建一個數(shù)組數(shù)組大小為權(quán)重和的大小,如值0的權(quán)重是8,則放入8個0值,值1的權(quán)重是2,則放入2個1值,依次類推。
然后用用一個權(quán)重和大小的隨機數(shù),產(chǎn)生隨機數(shù),即可。缺點要占用過多的內(nèi)存。

思路二:

權(quán)重和數(shù)組 w[i]存儲的是[0,i]元素的所有元素的權(quán)重和  時間復(fù)雜度O(n) 空間復(fù)雜度O(n)
隨機[0,W[399]] 看隨機數(shù) 落在哪個Wi 內(nèi)就選哪個  時間復(fù)雜度 O(longn)
所以總的時間復(fù)雜度時間復(fù)雜度O(n) 空間復(fù)雜度O(n)

偽代碼:

輪盤賭 并不是一種特別好的選擇算子,但它容易實現(xiàn)。
首先要明白一點,由于交叉、變異等算子,并不能控制進化方向,所以進化的重任落在選擇算子上。
如果明白了這一點,就好辦了。

輪盤賭,就是積累概率來實現(xiàn)的,通常適應(yīng)度大的被選擇的幾率較高。
假如:fit為適應(yīng)度數(shù)組,共m個

復(fù)制代碼 代碼如下:

for i=1 to m '先求和
sum=sum+fit(i)
next i
For i = 1 To n ‘n-是要生成多少個個體
temp = temp + fit(i)
If rnd <= temp / sum Then
   輸出 i 就是結(jié)果
Exit Function
End If
Next i

三、解決問題:

復(fù)制代碼 代碼如下:

package datastruct; 
 
import java.util.HashMap; 
import java.util.Map; 
 
/**
權(quán)重隨機數(shù):
如              權(quán)重:8  2  11  79
        權(quán)重返回的值:0  1  2   3
@author ajian005 79331356@qq.com
2014-2-16 21:12
輸出結(jié)果:{2.0=184128, 11.0=348551, 79.0=1308100, 8.0=159221}
*/ 
 
public class WeightRandomTest { 
    private static double[] weightArrays = {8.0,2.0,11.0,79.0};  // 數(shù)組下標是要返回的值,數(shù)組值為數(shù)組下標的權(quán)重 
    public static void main(String[] args) { 
        WeightRandom weightRandom = new WeightRandom(); 
        Map<Double, Integer> stat = new HashMap<Double, Integer>(); 
        for (int i = 0; i < 2000000; i++) { 
            int weightValue = weightRandom.getWeightRandom(weightArrays); 
            if (weightValue < 0) { 
                continue; 
            } 
            System.out.println("按權(quán)重返回的隨機數(shù):" + weightValue); 
            if (stat.get(weightArrays[weightValue]) == null) { 
                stat.put(weightArrays[weightValue], 1); 
            } else { 
                stat.put(weightArrays[weightValue], stat.get(weightArrays[weightValue])+1); 
            } 
        } 
        System.out.println(stat); 
    } 

 
class WeightRandom { 
    java.util.Random r = new java.util.Random(); 
    private double weightArraySum(double [] weightArrays) { 
        double weightSum = 0; 
        for (double weightValue : weightArrays) { 
            weightSum += weightValue; 
        } 
        return weightSum; 
    } 
    public int getWeightRandom(double [] weightArrays) { 
        double weightSum = weightArraySum(weightArrays); 
        double stepWeightSum = 0; 
        for (int i = 0; i < weightArrays.length; i++) { 
            stepWeightSum += weightArrays[i]; 
            if (Math.random() <= stepWeightSum/weightSum) { 
                //System.out.println(i); 
                return i; 
            } 
        } 
        System.out.println("出錯誤了"); 
        return -1; 
    }    

四、歸納總結(jié):

俄羅斯輪盤賭就是積累概率來實現(xiàn)

按權(quán)重負載調(diào)度等

相關(guān)文章

  • 詳解Java并發(fā)編程中的優(yōu)先級隊列PriorityBlockingQueue

    詳解Java并發(fā)編程中的優(yōu)先級隊列PriorityBlockingQueue

    PriorityBlockingQueue是Java中實現(xiàn)了堆數(shù)據(jù)結(jié)構(gòu)的線程安全的有界阻塞隊列。本文將會深入解讀PriorityBlockingQueue的源碼實現(xiàn),感興趣的可以了解一下
    2023-05-05
  • java后臺如何接收get請求傳過來的數(shù)組

    java后臺如何接收get請求傳過來的數(shù)組

    這篇文章主要介紹了java后臺如何接收get請求傳過來的數(shù)組問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot集成Liquibase的詳細步驟

    SpringBoot集成Liquibase的詳細步驟

    Liquibase 是一個強大的數(shù)據(jù)庫版本控制工具,能夠與 Spring Boot
    無縫集成,以簡化數(shù)據(jù)庫遷移和管理的過程,以下是從開始集成到最終運行的詳細步驟,需要的朋友可以參考下
    2024-12-12
  • MyBatis中的collection兩種使用方法及效率比較

    MyBatis中的collection兩種使用方法及效率比較

    collection主要是應(yīng)對表關(guān)系是一對多的情況,本文主要介紹了MyBatis中的collection兩種使用方法及效率比較,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • JVM中的守護線程示例詳解

    JVM中的守護線程示例詳解

    這篇文章主要給大家介紹了關(guān)于JVM中守護線程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • MyBatis多表連接查詢的實例教程

    MyBatis多表連接查詢的實例教程

    這篇文章主要給大家介紹了關(guān)于MyBatis多表連接查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 使用Flyway進行Java數(shù)據(jù)庫版本控制的操作指南

    使用Flyway進行Java數(shù)據(jù)庫版本控制的操作指南

    今天我們將深入探討如何使用Flyway進行Java數(shù)據(jù)庫版本控制,Flyway是一個流行的數(shù)據(jù)庫遷移工具,用于管理和自動化數(shù)據(jù)庫模式的演變,文中通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07
  • JVM Client和Server端有什么區(qū)別

    JVM Client和Server端有什么區(qū)別

    這篇文章主要介紹了JVM Client和Server端有什么區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Java判斷對象是否為空(包括null ,

    Java判斷對象是否為空(包括null ,"")的方法

    這篇文章主要介紹了Java判斷對象是否為空(包括null ,"")的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • SpringBoot整合neo4j使用詳解

    SpringBoot整合neo4j使用詳解

    這篇文章將和大家詳細聊聊如何在springboot應(yīng)用中集成和使用neo4j,文中有詳細的實現(xiàn)流程和實例代碼,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-10-10

最新評論

贵溪市| 龙陵县| 永康市| 金塔县| 乌兰县| 九龙坡区| 新竹市| 湾仔区| 永寿县| 西林县| 正安县| 邵武市| 商河县| 蒙自县| 吉林省| 保康县| 沙河市| 玛多县| 怀安县| 灌南县| 本溪市| 城市| 彝良县| 南木林县| 邢台县| 扶风县| 泸水县| 阳新县| 佛冈县| 宁南县| 永靖县| 香格里拉县| 深圳市| 青浦区| 化德县| 陆川县| 托克托县| 天祝| 安吉县| 明水县| 石城县|