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

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<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%,看起来我也并不是那么的菜嘛..


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值