概述
算法的思路为
- 将所有的key和value先放到一个集合
- 在添加在集合的过程中,权重是会累加的
- 生成介于0到100(总权重,不一定要为100)的随机数
- 通过累加的权重与这个随机数比较,如果比大于或等于它则输出
WeightedRandom.java
package util;
import java.util.*;
/**
* @Author Daniel
* @Description 根据权重生成随机数
**/
public class WeightedRandom {
public static void main(String[] args) {
Map<String, Double> map = new HashMap<>();
// 总和不一定非要等于100,是为了方便理解代码
map.put("一等奖", 1.0);
map.put("二等奖", 5.0);
map.put("三等奖", 10.0);
map.put("安慰奖", 30.0);
map.put("谢谢参与", 54.0);
// (输入值,生成多少个数)
getResult(map, 100);
}
class Bean {
String key;
double sumWeight;
}
// 将所有的bean放在一个集合中
List<Bean> beans = new ArrayList<>();
// 总权重
double sumWeight;
// 将单个实体放入到实体集合中
public void addBean(String key, double weight) {
// 计算总权重
sumWeight += weight;
// 给bean赋值
Bean b = new Bean();
b.key = key;
b.sumWeight = sumWeight;
// 放入集合
beans.add(b);
}
public String getRandom() {
// 生成介于0.0到100.0的数
double r = new Random().nextDouble() * sumWeight;
// 遍历所有实体
for (Bean bean : beans) {
// 如果目前遍历的实体和大于这个随机数则将其输出
/*
举例:
若权重和为100,生成的随机数为8.8,那么会得到三等奖
因为map的值是这样的{三等奖=10.0, 谢谢参与=54.0, 一等奖=1.0, 安慰奖=30.0, 二等奖=5.0}
而10.0(目前遍历的集合元素的权重和) > 8.8的,所以是三等奖
即[0,10]三等奖,(10,64]谢谢参与,(64,65]一等奖,(65,95]安慰奖,(95,100]二等奖
即我们需要的概率
*/
if (bean.sumWeight >= r) {
return bean.key;
}
}
return null;
}
public static void getResult(Map<String, Double> map, int count) {
// 每一个map对应一个WeightedRandom
WeightedRandom itemDrops = new WeightedRandom();
// 将map的值放入itemDrops对象中
for (int i = 0; i < map.size(); i++) {
for (Map.Entry<String, Double> m : map.entrySet()) {
itemDrops.addBean(m.getKey(), m.getValue());
}
}
for (int i = 0; i < count; i++) {
System.out.println(itemDrops.getRandom());
}
}
}
最后
以上就是时尚康乃馨为你收集整理的Java根据权重生成随机数的全部内容,希望文章能够帮你解决Java根据权重生成随机数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复