蒙特卡洛算法计算炉石传说竞技场胜率

来源:互联网 发布:mccall软件质量模型 编辑:程序博客网 时间:2024/04/30 06:34

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 stubMap<Integer,Integer> map = new HashMap<Integer,Integer>();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<count; i++) {double d = Math.random() - 0.5;if(d > 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%,看起来我也并不是那么的菜嘛..


0 0
原创粉丝点击