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 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; 
    }    

四、归纳总结:

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

按权重负载调度等

时间: 2024-09-26 16:16:25

Java实现按权重随机数_java的相关文章

java随机数生成具体实现代码_java

本文实例为大家分享了java随机数生成代码,供大家参考,具体内容如下 package com.gonvan.common.utils; import java.util.*; /** * 随机数工具 * * @author yuerzm * */ public final class LotteryAliasMethod { /** * The random number generator used to sample from the distribution. */ private fin

Java实现的权重算法(按权重展现广告)_java

基本算法描述如下: 1.每个广告增加权重 2.将所有匹配广告的权重相加sum, 3.以相加结果为随机数的种子,生成1~sum之间的随机数rd 4..接着遍历所有广告,访问顺序可以随意.将当前节点的权重值加上前面访问的各节点权重值得curWt,判断curWt >=  rd,如果条件成立则返回当前节点,如果不是则继续累加下一节点. 直到符合上面的条件,由于rd<=sum 因此一定存在curWt>=rd. 特别说明: 此算法和广告的顺序无关 import java.util.ArrayList

java生成字母数字组合的随机数示例 java生成随机数_java

复制代码 代码如下: package com.test; import java.util.Random; public class GenerateRandomNumber {  public static void main(String[] args) {   System.out.println("生成的10为随机数为:" + getCharAndNumr(10)); }  /**  * java生成随机数字和字母组合  * @param length[生成随机数的长度]  *

如何用java生成指定范围的随机数_java

要生成在[min,max]之间的随机整数, 复制代码 代码如下: package edu.sjtu.erplab.io; import java.util.Random; public class RandomTest {    public static void main(String[] args) {        int max=20;        int min=10;        Random random = new Random();         int s = ran

java验证码生成具体代码_java

本文实例为大家分享了java验证码生成的示例代码,供大家参考,具体内容如下 package com.gonvan.component.captcha; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Random; import javax.imag

java生成图片验证码实例代码_java

关于java图片验证码的文章最近更新了不少,帮助大家掌握java验证码的生成技术,下文为大家分享了java生成图片验证码最简单的方法,供大家参考. 现在各行业在定制系统时都会考虑到机器注册,现在最有效的方式就是输入验证.现在的验证方式有很多种: 一.问题验证,其实也是图片验证,在图片上生成问题,然后输入框输入答案. 二.图片验证,输入图片上展示的文字信息. 三.短信验证,比较繁杂,用户也不怎么喜欢. 四.还有就是百度最新的验证方式.图片上生成文字,然后出现一个文字点击框,选择你在验证图片上看到的

Java生成 6-8位 随机数

问题描述 Set<Integer>set=newHashSet<Integer>();Randomrandom=newRandom();while(set.size()<10){set.add(random.nextInt(999999));} 为啥会生成6位以下的? 解决方案 解决方案二:如何限制随机数为6-8位?解决方案三:set.add(100000+random.nextInt(900000));解决方案四:最土的方法Set<Integer>set=new

Java 多线程学习详细总结_java

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递      本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个

java随机字符串生成示例_java

复制代码 代码如下: package com.phyl.password; import java.util.ArrayList;import java.util.Arrays;import java.util.Random;/** * 字符随机生成类 * @author ASUS * */public class PassWord {  /**  * 密码类型枚举  * @author ASUS  */ public static enum TYPE {  /**   * 字符型   */