激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務器之家 - 編程語言 - JAVA教程 - Java實現按權重隨機數

Java實現按權重隨機數

2019-12-17 13:16junjie JAVA教程

這篇文章主要介紹了Java實現按權重隨機數,本文給出了提出問題、分析問題、解決問題三個步驟,需要的朋友可以參考下

一、問題定義:

問下有一個數組,這些數組中的值都有自己的權重,怎樣設計才能高效的優先取出權重高的數??

例如:

復制代碼代碼如下:

權重: 8  2  11  79
權重返回的值: 0  1  2   3

 

二、分析問題:

思路一:創建一個數組數組大小為權重和的大小,如值0的權重是8,則放入8個0值,值1的權重是2,則放入2個1值,依次類推。
然后用用一個權重和大小的隨機數,產生隨機數,即可。缺點要占用過多的內存。

思路二:

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

偽代碼:

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

輪盤賭,就是積累概率來實現的,通常適應度大的被選擇的幾率較高。
假如:fit為適應度數組,共m個

復制代碼代碼如下:

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 就是結果
Exit Function
End If
Next i

 

三、解決問題:

 

復制代碼代碼如下:

package datastruct;  
  
import java.util.HashMap;  
import java.util.Map;  
  
/** 
權重隨機數: 
如              權重:8  2  11  79 
        權重返回的值:0  1  2   3 
@author ajian005 [email protected] 
2014-2-16 21:12 
輸出結果:{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};  // 數組下標是要返回的值,數組值為數組下標的權重  
    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("按權重返回的隨機數:" + 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;  
    }     
}  

 

四、歸納總結:

俄羅斯輪盤賭就是積累概率來實現

按權重負載調度等

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99riav视频一区二区 | 久草在线手机视频 | av电影院在线观看 | 免费看日产一区二区三区 | 亚州综合一区 | 依人九九| 国产免费一区二区三区网站免费 | 亚洲一区二区三区四区精品 | 黄色大片在线免费看 | 天天操天天骑 | 国产精品av久久久久久网址 | 亚洲va国产va | 黄色18网站 | 羞羞答答影院 | 欧美www| 久久久久国产一区二区三区不卡 | 久久免费视频7 | 成人福利视频在线观看 | 欧美日韩中文字幕在线视频 | 欧美日韩在线中文 | 国产一区二区在线观看视频 | 九九热在线视频观看 | 一区在线免费视频 | www日韩大片 | 中文字幕精品在线观看 | 国产一级二级在线播放 | 国产亚洲综合一区二区 | 欧美日韩国产中文字幕 | 国产第一页精品 | 欧美一级黄色网 | 欧美日韩中文字幕在线视频 | 国产毛片在线 | 久久综合综合久久 | 国产午夜精品久久久久久免费视 | 美女wc| 视频一区二区三区在线观看 | 婷婷久久影院 | 成人午夜亚洲 | 国产欧美日韩二区 | 黄色毛片观看 | 毛片av网址 |