蒙特卡洛算法计算炉石传说竞技场胜率
来源:互联网 发布: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%,看起来我也并不是那么的菜嘛..
- 蒙特卡洛算法计算炉石传说竞技场胜率
- 德州扑克胜率计算
- FZU Problem 2232 炉石传说(匈牙利算法)
- 炉石传说爆牌鱼斩杀算法C语言实现
- 炉石传说 (转化为匈牙利算法来做的)
- 炉石传说
- CCF 炉石传说
- CCF炉石传说
- ccf 炉石传说
- CCF-炉石传说
- CCF-炉石传说
- CCF炉石传说
- 炉石传说辅助
- CCF炉石传说
- CCF-炉石传说
- CCF 炉石传说
- ccf炉石传说
- 炉石传说
- 利用 TC 给openstack neutron做带宽限制
- 【Java成长之路】--Struts2学习笔记
- 约定优于配置——软件开发的简约原则
- Java WebService 简单实例
- 【转】ZooKeeper基本原理
- 蒙特卡洛算法计算炉石传说竞技场胜率
- K-means算法的Java实现 聚类分析681个三国武将(1)
- P3P维修记录
- LINUX下防火墙状态查看,关闭等
- PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解
- 2016 Top 10 Android Library
- spring-mvc中配置fastjson
- (c++)输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
- 快速排序-洛谷 1177