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,即取值范 ...
随机推荐
- 【PyTorch v1.1.0文档研习】60分钟快速上手
阅读文档:使用 PyTorch 进行深度学习:60分钟快速入门. 本教程的目标是: 总体上理解 PyTorch 的张量库和神经网络 训练一个小的神经网络来进行图像分类 PyTorch 是个啥? 这是基 ...
- python正则表达式(6)--split、sub、escape方法
1.re.split 语法: re.split(pattern, string[, maxsplit=0, flags=0]) 参数: pattern 匹配的正则表达式 string ...
- P4281 [AHOI2008]紧急集合 / 聚会[LCA]
解析 蒟蒻用的办法比较蠢,不如上面的各位大佬,直接化成一个式子了,我还是分类讨论做的. 下面正文. 猜想:最优集合点一定是三点任意两对点对应的路径的交点. 不妨这样想,如果任意两个人经过同一条路径,那 ...
- python+ddt+unittest+excel+request实现接口自动化
接口自动化测试流程:需求分析-用例设计--脚本开发--测试执行--结果分析1.获取接口文档,根据文档获取请求方式,传输协议,请求参数,响应参数,判断测试是否通过设计用例2.脚本开发:使用request ...
- wordpress调用文章摘要,若无摘要则自动截取文章内容字数做为摘要
以下是调用指定分类文章列表的一个方法,作者如果有填写文章摘要则直接调用摘要:如果文章摘要忘记写了则自动截取文章内容字数做为摘要.这个方法也适用于调用description标签 <ul> & ...
- maven中jar冲突解决
Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题.本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲 ...
- js原型结构图
要素:对象原型.函数原型: [p] 原型对象: p 模版对象: 要构造的对象的信息: 构造函数具有原型对象和模版对象: 普通对象只具有模版对象: https://zhuanlan.zhihu. ...
- 电脑按键混乱,好像被锁定了Alt键
在知乎上找到一篇文章,https://zhuanlan.zhihu.com/p/34835461 解决了我的问题,解决办法是按住左右两边的alt+shift+ctrl
- EasyExcel引入
好久没更了,都在有道云上面记录,没时间搬过来. easyexcel是最近项目做优化涉及的一个改善点吧. 简介 导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个 ...
- LeetCode 422. Valid Word Square
原题链接在这里:https://leetcode.com/problems/valid-word-square/ 题目: Given a sequence of words, check whethe ...