Java实现按权重随机数

 更新时间:2015年04月28日 10:06:29   投稿:junjie  
这篇文章主要介绍了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 79331356@qq.com
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; 
    }    

四、归纳总结:

俄罗斯轮盘赌就是积累概率来实现

按权重负载调度等

相关文章

  • Java中Range函数的简单介绍

    Java中Range函数的简单介绍

    这篇文章主要介绍了Java中Range函数的简单介绍,Java中的range方法用于返回IntStream和LongStream在函数参数范围内的顺序值
    2022-07-07
  • SpringBoot集成Zipkin实现分布式全链路监控

    SpringBoot集成Zipkin实现分布式全链路监控

    这篇文章主要介绍了SpringBoot集成Zipkin实现分布式全链路监控的方法啊,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Java SpringBoot Validation用法案例详解

    Java SpringBoot Validation用法案例详解

    这篇文章主要介绍了Java SpringBoot Validation用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 快速搭建springboot项目(新手入门)

    快速搭建springboot项目(新手入门)

    本文主要介绍了快速搭建springboot项目(新手入门),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • SpringBoot实现微信及QQ绑定登录的示例代码

    SpringBoot实现微信及QQ绑定登录的示例代码

    本文主要介绍了SpringBoot实现微信及QQ绑定登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java三大特性-封装知识小结

    Java三大特性-封装知识小结

    所有的面向对象编程语言的思路都是差不多的,而这三大特性,则是思路中的支柱点,接下来我就重点讲解了一下java三大特性-封装,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-03-03
  • Java实现HDFS文件上传下载

    Java实现HDFS文件上传下载

    这篇文章主要为大家详细介绍了Java实现HDFS文件上传下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • java定义二维数组的几种写法(小结)

    java定义二维数组的几种写法(小结)

    下面小编就为大家带来一篇java定义二维数组的几种写法(小结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • java this super使用方法详解

    java this super使用方法详解

    Java中this、super关键字的用法简单说明:super是Java语言的保留字,用来指向类的超类,本文将详细介绍,需要的朋友可以参考下
    2012-12-12
  • Intellij Mybatis连接Mysql数据库

    Intellij Mybatis连接Mysql数据库

    最近在搞android的项目,在开发过程中遇到了好多问题,今天小编给大家说下mybatis连接MySQL数据库的方法,感兴趣的朋友跟着小编一起学习吧
    2016-10-10

最新评论