java Random 带权重的随机选择
实际场景中,经常要从多个选项中随机选择一个,不过,不同选项经常有不同的权重。
/**
* Created by xc on 2019/11/23
* 带权重的随机选择
*/
public class Test { public static void main(String[] args) {
Pair[] options = new Pair[]{new Pair("first", 3.3), new Pair("second", 3.3), new Pair("third", 3.3)};
WeightRandom rnd = new WeightRandom(options);
for (int i = 0; i < 10; i++) {
System.out.print(rnd.nextItem() + " ");
}
} }
/**
* Created by xc on 2019/11/25
* 表示选项和权重的类Pair
*/
public class Pair {
Object item;
double weight; public Pair(Object item, double weight) {
this.item = item;
this.weight = weight;
} public Object getItem() {
return item;
} public double getWeight() {
return weight;
}
}
/**
* Created by xc on 2019/11/25
* 代码清单7-9 带权重的选择WeightRandom
*/
public class WeightRandom {
private Pair[] options;
private double[] cumulativeProbabilities;
private Random rnd; public WeightRandom(Pair[] options) {
this.options = options;
this.rnd = new Random();
prepare();
} /**
* prepare()方法计算每个选项的累计概率,保存在数组cumulativeProbabilities中
*/
private void prepare() {
int weights = 0;
for (Pair pair : options) {
weights += pair.getWeight();
}
cumulativeProbabilities = new double[options.length];
int sum = 0;
for (int i = 0; i < options.length; i++) {
sum += options[i].getWeight();
cumulativeProbabilities[i] = sum / (double) weights;
}
} /**
* nextItem()方法根据权重随机选择一个,具体就是,首先生成一个0~1的数,
* 然后使用二分查找,如果没找到,返回结果是-(插入点)-1,所以-index-1就是插入点,插入点的位置就对应选项的索引。
* @return
*/
public Object nextItem() {
double randomValue = rnd.nextDouble();
int index = Arrays.binarySearch(cumulativeProbabilities, randomValue);
if (index < 0) {
index = -index - 1;
}
return options[index].getItem();
}
}
java Random 带权重的随机选择的更多相关文章
- python random从集合中随机选择元素
1.使用python random模块的choice方法随机选择某个元素 from random import choice foo = ['a', 'b', 'c', 'd', 'e'] print ...
- Java编程的逻辑 (34) - 随机
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- python random 随机选择操作
# -*- coding:utf-8 -*- import random arr = ['A','B','C','D','E','F'] #生成(0.0, 1.0)的随机数 print random. ...
- Java实现 LeetCode 528 按权重随机选择(TreeMap)
528. 按权重随机选择 给定一个正整数数组 w ,其中 w[i] 代表位置 i 的权重,请写一个函数 pickIndex ,它可以随机地获取位置 i,选取位置 i 的概率与 w[i] 成正比. 说明 ...
- java Random随机生成一个数
package java05; import java.util.Random; /* Random随机生成一个数字 1.导包: import java.util.Random; 2.创建 Rando ...
- random os 序列化 模块模块 随机选择
# 1 random 模块 随机选择# import random#随机取小数# ret = random.random() #空是0到1之间的小数字# print(ret)# # 0.0799728 ...
- Python之随机选择 random
随机选择:random import random # 从一个序列中随机的抽取一个元素 values=[1,2,3,4,56] # 指定取出N个不同元素 print(random.sample(val ...
- java Random类和Math.Rondom
Java中存在着两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取 ...
- JAVA Random 详解
Java中存在着两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范 ...
随机推荐
- 团队第四次——Alpha版本的发布
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/ 这个作业要求在哪里 https:// ...
- PL/SQL Developer 快捷键
前面我有分享了一个PLSQL美化规则,其实通过统一的美化SQL,把这里SQL写在Java代码里可以比较容易阅读代码,且保持良好得编码风格. 在工作中我们也经常使用PLSQL来写一SQL,有些常用的SQ ...
- Dockerfile 常见指令的意义/常见的使用方式/使用示例/
一.什么是 Dockerfile ? Dockerfile 就是生成docker镜像的指令集, 通过使用docker工具执行这些指令集可以方便快捷地生成镜像, 并且能不断复用 Dockerfile 指 ...
- python预课05 爬虫初步学习+jieba分词+词云库+哔哩哔哩弹幕爬取示例(数据分析pandas)
结巴分词 import jieba """ pip install jieba 1.精确模式 2.全模式 3.搜索引擎模式 """ txt ...
- Xcode 创建.a和framework静态库(转)
最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录. 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.iOS中的静 ...
- cpu的发现
system.cpu.discovery 检测到的CPU/CPU内核列表.用于低级发现 返回的cpu从0开始编号,其他关于cpu的监控项就可以使用cpu的id进行单个cpu的资源监控
- bzoj3073: [Pa2011]Journeys 线段树优化建图
bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...
- js处理事件冒泡(兼容写法)
event = event || window.event; if (event.stopPropagation) { event.stopPropagation(); } else { event. ...
- 第09组 Alpha冲刺(5/6)
队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络请求,前端 ...
- React 如何适用less
1.使用 create-react-app 创建的项目,默认情况下是看不到 webpack 相关的配置文件,我们需要给它暴露出来,使用下面命令即可: npm run eject 2.添加less np ...