程序员带你分析。游戏开箱的“积分赛”,真的能拿走主播的豪车吗

最近小编发现各大平台的游戏主播,都开始玩起了“积分赛”。这里我先给大家介绍一下积分赛是什么,拿CS:GO游戏举例,号主自掏腰包购买一定量的游戏盲盒。然后主播直播开启这些盲盒,众所周知游戏中的物品都存在稀有度,稀有度与物品在盲盒中出现的概率挂钩,也就是说概率越高物品稀有度越低。

程序员带你分析。游戏开箱的“积分赛”,真的能拿走主播的豪车吗

言归正传,目前已知CS:GO主播开箱一般规则为开启200箱,箱子会出现蓝、紫、粉、红、金(按照稀有度从低到高排列),五种颜色当开启的盲盒出现蓝、紫色时不计分,出现粉色累加5分、红色10分、金色20分。当200箱开启完毕后根据积分获得对应的奖励。

40分:2000RMB 50分:索尼PS5 60分:苹果14 80分:苹果笔记本pro

100分:外星人笔记本 120分:苹果14*15 140分:宝马汽车 160分:奔驰E

180分:保时捷帕拉梅拉

程序员带你分析。游戏开箱的“积分赛”,真的能拿走主播的豪车吗

现在小编要用程序模拟万次开箱,来看一下结果如何,但是还缺少一个参数,就是每个箱子的概率。通过CS:GO的官网查询到每个级别的概率分别为:

蓝色0.7991	紫色0.1598	粉色0.032	红色0.0065	金色0.0026

好了,现在可以开始了,我会在文章最后贴出代码,有兴趣的小伙伴可以自己尝试测试一下。

运行一次结果:

本次开箱子共得分:30

其中获得蓝色色箱子:38

其中获得紫色色箱子:158

其中获得粉色箱子 2 个,获得 10 分

其中获得红色箱子 2 个,获得 20 分

其中获得金色箱子 0 个,获得 0 分

运行1000次结果为了方便观察仅展示每次的总分数:

05分:04次----10分:04次----15分:18次----20分:27次----25分:31次

30分:46次----35分:80次----40分:86次----45分:94次----50分:93次

55分:91次---- 60分:90次----65分:80次----70分:67次----75分:56次

80分:35次----85分:28次----90分:21次----95分:14次----100分:14次

105分:5次----110分:4次----115分:5次----120分:1次----125分:1次

可以看到最高能得到的奖励仅为120分档的苹果14*15,共计获取两次。距离180分的豪车还差55分。那么需要多少次能达到180分呢?带着这个疑问我将代码改造成了死循环,只有积分达到180分才会结束,这次让我们来看看结果吧。

程序员带你分析。游戏开箱的“积分赛”,真的能拿走主播的豪车吗

次数:180635

本次开箱子共得分:185

其中获得蓝色色箱子:35

其中获得紫色色箱子:146

其中获得粉色箱子 11 个,获得 55 分

其中获得红色箱子 3 个,获得 30 分

其中获得金色箱子 5 个,获得 100 分

0分:33次----5分:303次----10分:950次----15分:2366次----20分:4540次

25分:7378次----30分:10258次----35分:13134次----40分:15102次----45分:16558次

50分:16791次----55分:16318次----60分:14819次----65分:13250次----70分:11322次

75分:9393次----80分:7436次----85分:5801次----90分:4345次----95分:3154次

100分:2371次----105分:1631次----110分:1172次----115分:811次----120分:495次

125分:337次----130分:218次----135分:145次----140分:80次----145分:41次

150分:39次----155分:15次----160分:12次----165分:8次----170分:7次

175分:2次----185分:1次

这次的结果相当惊人,在第180635次才得到了185分的成绩,其中光金色就出现了5次。

这个结果不知道在多少人的预料呢?根据这个结果你觉得这个几率你可以接受吗?

程序员带你分析。游戏开箱的“积分赛”,真的能拿走主播的豪车吗

最后把本次代码贴出:


   public static String CSBoxSimulation(int count){
       Map<Integer,Integer> map=new HashMap<>();
       StringBuffer stringBuffer=new StringBuffer();
       for (int j = 0; j < count; j++) {
           int totalScore = 0;
           int blueCount = 0;
           int purpleCount = 0;
           int pinkCount = 0;
           int redCount = 0;
           int goldCount = 0;
           Random rand = new Random();

           for (int i = 0; i < 200; i++) {
               double r = rand.nextDouble();
               if (r < 0.7991) {
                   // 开出蓝
                   blueCount++;
               } else if (r < 0.7991 + 0.1598) {
                   // 开出紫
                   purpleCount++;
               } else if (r < 0.7991 + 0.1598 + 0.032) {
                   // 开出粉
                   pinkCount++;
                   totalScore+=5;
               } else if (r < 0.7991 + 0.1598 + 0.032 + 0.0065) {
                   // 开出红
                   redCount++;
                   totalScore+=10;
               } else {
                   // 开出金
                   goldCount++;
                   totalScore+=20;
               }
           }
           Integer integer = map.get(totalScore);
           if(integer == null){
               integer = 0;
           }
           map.put(totalScore,++integer);
           stringBuffer.append(totalScore+",");
           //只有180才会退出循环
           if(totalScore >= 180) {

           System.out.println("次数:" + j);
           System.out.println("本次开箱子共得分:" + totalScore);
           System.out.println("其中获得蓝色色箱子:" + purpleCount);
           System.out.println("其中获得紫色色箱子:" + blueCount);
           System.out.println("其中获得粉色箱子 " + pinkCount + " 个,获得 " + (pinkCount * 5) + " 分");
           System.out.println("其中获得红色箱子 " + redCount + " 个,获得 " + (redCount * 10) + " 分");
           System.out.println("其中获得金色箱子 " + goldCount + " 个,获得 " + (goldCount * 20) + " 分");
               break;
           }
//           System.out.println("本次开箱子共得分:" + totalScore);
//           System.out.println("其中获得蓝色色箱子:" + purpleCount);
//           System.out.println("其中获得紫色色箱子:" + blueCount);
//           System.out.println("其中获得粉色箱子 " + pinkCount + " 个,获得 " + (pinkCount * 5) + " 分");
//           System.out.println("其中获得红色箱子 " + redCount + " 个,获得 " + (redCount * 10) + " 分");
//           System.out.println("其中获得金色箱子 " + goldCount + " 个,获得 " + (goldCount * 20) + " 分");
       }
       map = sortMapByKey(map);

       int k = 0;
       for (Integer key:map.keySet()) {
           k++;
           Integer integer = map.get(key);
           if(k % 5 == 0) System.out.println(key+"分:"+integer+"次");
           else System.out.print(key+"分:"+integer+"次----");
       }
       return stringBuffer.toString();
   }
    /**
     * 使用 Map按key进行排序
     * @param map
     * @return
     */
    public static Map<Integer, Integer> sortMapByKey(Map<Integer, Integer> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }

        Map<Integer, Integer> sortMap = new TreeMap<Integer, Integer>(
                new MapKeyComparator());

        sortMap.putAll(map);

        return sortMap;
    }
    static class MapKeyComparator implements Comparator<Integer>{

        @Override
        public int compare(Integer str1, Integer str2) {

            return str1.compareTo(str2);
        }
    }