2年不碰炉石,最近无聊,捡起来玩玩竞技场,发现已经变菜鸡,正好看到蒙特卡洛算法,那么就用来计算下竞技场胜场的概率吧
炉石是个零和游戏,有一个人胜,那么就一定有一个人负, 当一个人胜利12场,或者输掉3场,那么这个人对局就算结束了
需要重新开一局(也就是胜负场清零)
炉石匹配一般会匹配到差不多胜场的对手,那么可以近似看作胜率在50%吧
假设就是2个人在不停的对局(一个人结束后清零,也可以看做是换人了吧)
第一个人胜场为x1,负场为y1 , 第二个人胜场x2, 负场 y2 ,对局100万次,程序如下:
package com.xp.test;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
public class Hearthstone {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map map = new HashMap();
map.put(0, 0);
map.put(1, 0);
map.put(2, 0);
map.put(3, 0);
map.put(4, 0);
map.put(5, 0);
map.put(6, 0);
map.put(7, 0);
map.put(8, 0);
map.put(9, 0);
map.put(10, 0);
map.put(11, 0);
map.put(12, 0);
int n1 = 0;
int n2 = 0;
int count = 10000000;
int x1 = 0; int y1 = 0;
int x2 = 0; int y2 = 0;
for(int i=0; i 0) {n1++;
x1++; y2++;
} else if(d < 0) {n2++;
x2++; y1++;
}
//游戏结束
if(x1 == 12 || y1 == 3) {
map.put(x1, map.get(x1) + 1);
x1 = 0; y1 = 0;
}
if(x2 == 12 || y2 == 3) {
map.put(x2, map.get(x2) + 1);
x2 = 0; y2 = 0;
}
}
System.out.println("第一位的胜场:" + n1 + ":第二位的胜场" + n2);
int sum = 0;
for(int i=0; i<=12; i++) {
sum += map.get(i);
}
System.out.println("完成对局:" + sum);
for(int i=0; i<=12; i++) {
System.out.println(i + "胜利概率:" + (new BigDecimal(map.get(i).toString()).multiply(new BigDecimal("100")).divide(new BigDecimal(sum),4,BigDecimal.ROUND_HALF_UP)));
}
BigDecimal three = new BigDecimal(map.get(0) + map.get(1) + map.get(2) + map.get(3)).multiply(new BigDecimal("100")).divide(new BigDecimal(sum),4,BigDecimal.ROUND_HALF_UP);
BigDecimal six = new BigDecimal(map.get(0) + map.get(1) + map.get(2) + map.get(3) + map.get(4) + map.get(5) + map.get(6)).multiply(new BigDecimal("100")).divide(new BigDecimal(sum),4,BigDecimal.ROUND_HALF_UP);
System.out.println("3胜及以下概率:" + three);
System.out.println("6胜及以下概率" + six);
}
}
第一位的胜场:5000841:第二位的胜场4999159
完成对局:3342759
0胜利概率:12.5081
1胜利概率:18.7444
2胜利概率:18.7476
3胜利概率:15.6277
4胜利概率:11.7144
5胜利概率:8.2129
6胜利概率:5.4586
7胜利概率:3.5103
8胜利概率:2.1985
9胜利概率:1.3479
10胜利概率:0.8090
11胜利概率:0.4710
12胜利概率:0.6496
3胜及以下概率:65.6278
6胜及以下概率91.0137
意外的是12胜的概率,居然比11要高, 这是因为12胜有3种情况:12胜0负,12胜1负,12胜2负(如果没有胜场限制,等于是把所有大于等于12胜的概率相加)
而其他情况都只能是3负(投降不计算)
永动的概率为7胜及以上,达到9%,看似还不错,但如果每个月100次完整对局,还能达到永动,那么几率就只有0.09%了
当然跟实际情况会有些出入,运气和实力,实力强的对手,最开始匹配时一般会匹配到实力弱的,
那么胜率肯定超过50%,这些人的永动几率在超过一定场次后不会随场次增加而减少
而3胜及以下的概率达到65.5%,看起来我也并不是那么的菜嘛..