Java根据权重按比例返回相应的值

左手的ㄟ右手 2022-07-13 07:49 565阅读 0赞

根据权重等比例返回相应的值,有很多种实现方式和途径。这里简单演示两种Java的程序实现,先贴代码:

  1. public static void main(String[] args) throws ParseException {
  2. Map<String, Integer> map = new HashMap<>();
  3. map.put("A", 20);
  4. map.put("B", 10);
  5. map.put("C", 40);
  6. map.put("D", 30);
  7. //获取权重总和
  8. Integer sum = map.values().parallelStream().reduce(Integer::sum).get();
  9. //测试500W次
  10. Integer total = 5000000;
  11. //第一种方式
  12. int a = 0, b = 0, c = 0, d = 0;
  13. for (int i = 0; i < total; i++) {
  14. Integer random = new Random().nextInt(sum);
  15. for (String str : map.keySet()) {
  16. int weight = map.get(str);
  17. if (random > weight) {
  18. random -= weight;
  19. } else {
  20. switch (str) {
  21. case "A":
  22. a++;
  23. break;
  24. case "B":
  25. b++;
  26. break;
  27. case "C":
  28. c++;
  29. break;
  30. case "D":
  31. d++;
  32. break;
  33. }
  34. break;
  35. }
  36. }
  37. }
  38. System.out.println("第一种方式:");
  39. System.out.println("A:" + a + " 占比:" + ((float) a / total));
  40. System.out.println("B:" + b + " 占比:" + ((float) b / total));
  41. System.out.println("C:" + c + " 占比:" + ((float) c / total));
  42. System.out.println("D:" + d + " 占比:" + ((float) d / total));
  43. //第二种方式
  44. List<String> list = new ArrayList<>();
  45. map.keySet().forEach(key -> {
  46. int value = map.get(key);
  47. for (int i = 0; i < value; i++) {
  48. list.add(key);
  49. }
  50. });
  51. Collections.shuffle(list);
  52. int A = 0, B = 0, C = 0, D = 0;
  53. for (int i = 0; i < total; i++) {
  54. String str = list.get(new Random().nextInt(sum));
  55. switch (str) {
  56. case "A":
  57. A++;
  58. break;
  59. case "B":
  60. B++;
  61. break;
  62. case "C":
  63. C++;
  64. break;
  65. case "D":
  66. D++;
  67. break;
  68. }
  69. }
  70. System.out.println("\n第二种方式:");
  71. System.out.println("A:" + A + " 占比:" + ((float) A / total));
  72. System.out.println("B:" + B + " 占比:" + ((float) B / total));
  73. System.out.println("C:" + C + " 占比:" + ((float) C / total));
  74. System.out.println("D:" + D + " 占比:" + ((float) D / total));
  75. }

实验结果:
这里写图片描述

根据结果可以看出,两种方式都能满足要求。但相对而言,第一种方式更能省内存。

发表评论

表情:
评论列表 (有 0 条评论,565人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设置问题

    `一个简单的方法根据权重,按照比例随机显示对应的广告, 权重值越大,概率越大。 比如有个广告list,广告属性有id,weight,写个通用方法来根据权重显示广告id:` `

    相关 528. 随机选择

    给定一个正整数数组 w ,其中 w\[i\] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 i 的概率与 w