我是靠谱客的博主 时尚康乃馨,这篇文章主要介绍Java根据权重生成随机数,现在分享给大家,希望可以做个参考。

算法的思路为

  1. 将所有的key和value先放到一个集合
  2. 在添加在集合的过程中,权重是会累加的
  3. 生成介于0到100(总权重,不一定要为100)的随机数
  4. 通过累加的权重与这个随机数比较,如果比大于或等于它则输出

WeightedRandom.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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根据权重生成随机数内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(85)

评论列表共有 0 条评论

立即
投稿
返回
顶部