算法题——投篮比赛获胜概率问题
问题描述:
甲乙两人比赛投篮。约定甲先投篮,每人投篮投进一球,则继续投球,若投失一球,则换人投球。初始积分为1分,甲每投进一球,积分加1分;乙每投进1球,积分减1分。若积分达到N分(N>1),甲获胜;若积分减至0分,乙获胜。假定甲投进的概率为P1(0<P1<1),乙投进的概率为P2(0<P2<1)。那么这场投篮比赛,甲获胜的概率P为多少?
很显然的,甲获胜的概率P是和P1、P2、N相关的。
P1越大,P越大
P2越大,P越小
N越大,P越小
不失一般性,假设P1=0.7,P2=0.3,N=4,求甲获胜的概率P
解法一:大数量模拟法(10000000次)
在前文 算法题——投篮比赛获胜的概率 中介绍的就是这种方法。
用计算机模拟10000000次比赛的过程,统计甲获胜的次数。然后甲获胜的次数比上总次数接近甲获胜的概率。
一共模拟了10批次的比赛,每批次模拟10000000次比赛的过程(P1=0.7,P2=0.3,N=4)
第1批次,甲获胜8282467次
第2批次,甲获胜8282839次
第3批次,甲获胜8283808次
第4批次,甲获胜8281636次
第5批次,甲获胜8282652次
第6批次,甲获胜8283432次
第7批次,甲获胜8281948次
第8批次,甲获胜8284125次
第9批次,甲获胜8284626次
第10批次,甲获胜8283720次
平均10个批次,平均甲获胜8283125次。那么甲获胜的概率大约是82.83125%
解法二:矩阵法
解法一是建立在大量的模拟上,所得的数据离理论值还是有一定的偏差的(模拟的次数越多,偏差值越小)。那么,本方法就是从理论上来计算甲获胜的概率P的。
分析该问题,可以得出整个问题存在8个状态(状态的个数和N有关,状态的个数为2N个)
分别是
积分0分,乙获胜
积分1分,乙要投篮;积分1分,甲要投篮
积分2分,乙要投篮;积分2分,甲要投篮
积分3分,乙要投篮;积分3分,甲要投篮
积分4分,甲获胜
这8个状态之间的关系可以用下图表示(为了后文表述方便,给这8个状态起了名字,分别是S1、S2、S3、……、S7、S8)
如图,比赛初始是在S1状态,比赛结束在S7(甲获胜)或S8(乙获胜)状态,状态之间有转换箭头。
例如:当前是S3状态(积分3,甲投篮),那么下一个状态可能是S6(甲投失,换成积分3,乙投篮的状态)或者是S7(甲投进,积分4,甲获胜的状态)。再比如当前是S6状态(积分3,乙投篮),那么下一个状态可能是S5(乙投进,换成积分2,乙投篮的状态)或者是S3(乙投失,换成积分3,甲投篮的状态)
用A1、A2、A3、A4、A5、A6、A7、A8表示某次投篮后,各个状态所占的比重。那么再投篮一次后,各个状态的所占比重计算如下(等号左边是新的比重,等号右边是原来的比重):
A1=A4(1-P2)
A2=A1P1+A5(1-P2)
A3=A2P1+A6(1-P2)
A4=A5P2+A1(1-P1)
A5=A6P2+A2(1-P1)
A6=A3(1-P1)
A7=A3P1+A7
A8=A4P2+A8
可以把上面的计算式子转换为矩阵的形式
令向量Ti=(A1、A2、A3、A4、A5、A6、A7、A8)表示第i次(i=0时表示初始状态)投篮各状态所占比重的向量,则
Ti+1=Ti×A
其中,A为8*8的矩阵,如下图所示
因为
T1=T0×A
T2=T1×A=T0×A×A=T0×A2
T3=T2×A=T0×A2×A=T0×A3
……
TM=T0×AM
实际上,本题中的甲获胜的概率就是当M趋向于无穷时,TM的A7分量。同时,TM的A8分量表示乙获胜的概率
把上面的矩阵A分成四个小矩阵Q1、Q2、Q3、Q4,如下图所示:
由于TM=T0×AM,故在这儿分析AM
由于矩阵I-Q1可逆,则上述的表达式可以简化为
Q1M-1+Q1M-2+…+Q1+I=(Q1M-1+Q1M-2+…+Q1+I)(I-Q1)(I-Q1)-1
=(Q1M-1+Q1M-2+…+Q1+I-Q1M-Q1M-1-…-Q1)(I-Q1)-1
=(I-Q1M)(I-Q1)-1
于是矩阵AM就简化成如下形式
对于矩阵Q1来说。由于是非负矩阵,根据G. Frobenius可知,它的谱半径ρ满足不等式,r≤ρ≤R。其中r表示G1矩阵中所有行和值(一行所有元素加起来的值)的最小值,R表示G1矩阵中所有行和值最大值。可知R=1,r=MIN(1-P1,1-P2)
而在李华所著的《非负矩阵谱半径的一个新估计》中,将谱半径的范围缩小
得到如下的不等式
r≤ρ≤R-(1-P2)(R-r)/R
由此可以得知Q1的谱半径ρ<1
而利用谱半径的性质可知,当谱半径ρ<1时,矩阵Q1的M次方趋向于0矩阵
于是本问题就得出了结论,令T为TM中M趋向无穷大时的向量,A*为AM中M趋向无穷大时的矩阵。可知
T=T0×A*
本题中P1=0.7,P2=0.3,T0=(1,0,0,0,0,0,0,0)
矩阵A和矩阵A*分别为
于是
T=T0×A*=(0,0,0,0,0,0,0.828302342,0.171697658)
甲获胜的概率是82.8302342%,乙获胜的概率是17.1697658%
和方法一的结论比较(82.83125%),还是非常接近的。也间接说明了方法一的可行性。
本方法从理论的角度给出了问题的解。本示例中,P1=0.7,P2=0.3,N=4
本方法的计算难点就是求(I-Q1)-1,这是一个消耗大量计算时间的过程。Q1是一个2N-2*2N-2的稀疏矩阵,I-Q1也是一个2N-2*2N-2的稀疏矩阵,求它的逆矩阵是非常耗时的
可以在本方法的理论基础上,给出简化的计算方法,也就是接下来讲的迭代法
解法三:迭代法
迭代法的理论基础在解法二上
依次计算向量T1、T2、……、TM等等
若TM+1-TM≈0(若每个分量小于10-9,我们就认为两个向量相等),
还是以上面的示例为例(P1=0.7,P2=0.3,N=4)
T1=(0,0.7,0,0.3,0,0,0,0)
T2=(0.21,0,0.49,0,0.21,0,0,0.09)
T3=(0,0.294,0,0.126,0,0.147,0.343,0.09)
T4=(0.0882,0,0.3087,0,0.1323,0,0.343,0.1278)
T5=(0,0.15435,0,0.06615,0,0.09261,0.55909,0.1278)
T6=(0.046305,0,0.172872,0,0.074088,0,0.55909,0.147645)
T7=(0,0.0842751,0,0.0361179,0,0.0518616,0.6801004,0.147645)
T8=(0.02528253,0,0.09529569,0,0.04084101,0,0.6801004,0.15848037)
T9=(0,0.046286478,0,0.019837062,0,0.028588707,0.746807383,0.15848037)
T10=(0.013885943,0,0.05241263,0,0.022462556,0,0.746807383,0.164431489)
T11=(0,0.025443949,0,0.01090455,0,0.015723789,0.783496224,0.164431489)
T12=(0.007633185,0,0.028817417,0,0.012350321,0,0.783496224,0.167702854)
T13=(0,0.013988454,0,0.005995052,0,0.008645225,0.803668415,0.167702854)
T14=(0.004196536,0,0.015843576,0,0.006790104,0,0.803668415,0.169501369)
……
T71=(0,4.08706E-10,0,1.7516E-10,0,2.52594E-10,0.828302342,0.171697657)
T72=(1.22612E-10,0,4.6291E-10,0,1.9839E-10,0,0.828302342,0.171697658)
T72≈T71,故可以认为T=(0,0,0,0,0,0,0.828302342,0.171697658)
也就是甲获胜的概率是82.8302342%,乙获胜的概率是17.1697658%
本方法相比解法二,计算上来得简单,仅仅通过迭代计算(加加乘乘),就计算出最后的结果。相比求矩阵的逆来说,要简单的多。
本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/p/3456498.html,如需转载请自行联系原作者
算法题——投篮比赛获胜概率问题相关推荐
- 算法题——投篮比赛获胜的概率
近日,在和他人闲暇无事的时候,进行篮球投篮比赛.由于本人的投篮命中率比较低,而他的投篮命中率比较高.因此,定了一个规则.采用积分制,初始积分为1分.他投篮,每投中一个球,积分加1分,继续投篮:投不中, ...
- leetcode算法题--飞机座位分配概率
原题链接:https://leetcode-cn.com/problems/airplane-seat-assignment-probability/ 假设有n个人,即n个座位,当第1个人入座时有三种 ...
- Java基础算法题(18):两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三
查看所有50道基础算法题请看: Java的50道基础算法题 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c ...
- 每周算法题(从三个红球、五个白球、六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案,有1、2、3、4数字,组成无重复的三位数两个乒乓球队进行比赛,各出三人。甲队为a,b,c)
每周算法题 文章目录 每周算法题 一.从三个红球.五个白球.六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案. 二.有1.2.3.4数字,组成无重复的三位数 两个乒乓球队进行比赛,各出三 ...
- 一道看完答案你会觉得很沙雕的「动态规划算法题」
这道算法题其实并不难,如果你把文章从头到尾看完的话基本上能看懂,但如果你看到最后的话大概率会说一句:这是什么沙雕题目?! 题目来源于 LeetCode 第 877 号问题:石子游戏. 为了更好理解,我 ...
- 算法题指南书_分类算法指南
算法题指南书 Today, we will see how popular classification algorithms work and help us, for example, to pi ...
- 一看“左程云:200道算法与数据结构”,二刷“阿里云:70+算法题、30种大厂笔试高频知识点”,3月过去终于挺进我梦中的字节!
不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...
- 字节跳动2021年4月面试算法题库
本文汇总了牛客2021.4.1~2021.4.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...
- 字节跳动3月面试遇到的高频算法题
本文汇总了牛客2021.3.1~2021.3.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...
- 程序员的数学课22 面试中那些坑了无数人的算法题
前面的课时,我们学习了"代数与统计""算法与数据结构",至今这门课程的主体知识已告一段落,下面我们进入彩蛋环节,我会向你介绍两个应用到数学的场景,第一个是求职面 ...
最新文章
- boost::adjacency_list用法的测试程序
- EFCore Lazy Loading + Inheritance = 干净的数据表 (二)
- wp insert post 插入文章到数据库
- [css] 如何让背景图片固定不随滚动条滚动
- 通过数组和枚举简化GPIO操作编码
- 微擎微信公众号小程序框架v2.7.3去sq一键安装纯净商业版
- magento 获取 pages/Static Block 内容 Get Pages/Static Block in Magento
- Linux nm命令
- Penn Treebank Tags做点小翻译 (下篇)
- ABP框架详解(一)ABPBootstrapper
- python自定义函数两个返回值如何分别输出_第八讲 python自定义函数返回值
- 安装QTP10.0 报需要先安装 c++组件
- DelphiXE10.2.3 Firemonkey下窗体的编译异常处理
- 智慧城市顶层设计实施工作指南
- Tropical Cyclone Intensity Estimation
- 如何下载jQuery
- root格式化linux,Linux-格式化与检验-mkfs
- 安装visio后,EXCEL打开后滚动鼠标滑轮自动退出解决方法
- JavaScript之读取txt文本文件内容
- 经典论文解读 — 端到端的VL预训练网络SOHO
热门文章
- Node.js学习笔记(二)
- SAP WM Stock Removal Strategy - StringentFIFO 在仓库号级别下的先进先出
- Exchange 2013学习(九),Autodiscover
- 【Vegas原创】控制文件损坏,使用trace文件恢复DB
- DirectX编程:[初级]C#中利用DirectSound播放WAV格式声音[最少只要4句话]
- (转)马云:不要迷信成功学 要多看别人的失败经历
- uboot修改传递给内核的cmdline的方法
- Anatomy of a Program in Memory
- MESSAGE消息发送失败
- Guava LoadingCache用法