最近小编发现各大平台的游戏主播,都开始玩起了“积分赛”。这里我先给大家介绍一下积分赛是什么,拿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);
}
}