[手游抽卡]动态规划的简单应用,我想要抽一张W,到底有多大的机会

抽卡规则

明日方舟「一周年庆典」,【遗愿焰火】限定寻访开启。

活动时间:05月01日 16:00 - 05月15日 03:59

活动说明:活动期间【遗愿焰火】限定寻访开启,该寻访中以下干员出现率上升

★★★★★★:W[限定] \ 温蒂(占6★出率的70%

★★★★★:极境(占5★出率的50%)

【限定寻访】说明

◆在所有【限定寻访】中,如果连续50次没有获得6星干员,则下一次获得6星干员的概率将从原本的2%提升至4%,如果该次还没有寻访到6星干员,则下一次寻访获得6星的概率由4%提升到6%。依此类推,每次提高2%获得6星干员的概率,直至达到100%时必定获得6星干员

问题

我只能抽100次,我抽到W的概率有多大?如果能抽150次呢?
如果抽到W就停下来,那我需要抽多少次?

分析

W和温蒂这两张6星卡站6星出率的70%,这里默认W和温蒂的出率是相等的,都是35%
由于随着抽卡的进行,抽到6星卡的概率会发生变化,所以每次抽卡不在是相互独立事件,给我们计算概率造成了很大的麻烦。所以这里最需要解决的问题就是抽到6星卡的概率。而这张卡是不是W,反而不是难点(但这是重点

两个模型:

  1. 固定抽卡次数,计算抽到不同张数6星卡的概率
  2. 抽到即止,计算需要不同抽卡次数的概率

第一个模型看起来复杂一点,因为随这抽卡的进行,概率会发生变化,一旦抽到6星,概率会回到2%,谁又知道啥时候会抽到一个6星呢?第二个模型就轻松多了,抽到6星之前,每次抽卡的概率都是可知的,直到抽到6星为止。这个概率是可以简单计算的,即使抽到的6星不是W,我们可以再抽一轮,而这一轮和上一轮可以说是相互独立的事件。 虽然复杂程度高了,但依然是可以计算的。

开始抽卡

既然说了动态规划,肯定是要解决第一个问题的。第二个问题可以直接正向计算,这里就不说了。

对于抽n次,抽到几个6星卡的概率是不好直接计算的,但如果我知道抽n-1次卡,抽到几个6星的概率,是不是就可以计算了?
抽n次,抽到k个6星卡的概率记为P(n,k)
单次抽到6星卡的概率记为p,抽不到的概率记为q = 1 -p
那么 P(n,k) = p * P(n-1, k-1) + q * P(n-1, k)
递推公式这不就出来了嘛, 大事化小,小事化了,问题解决了!

等等,说好的随着抽卡的进行, 抽到6星的概率会跟着变化呢!
对对对,抽卡概率是会变的。前面连续抽卡50次没有6星,概率每次要递加2%, 所以

// 连续i次抽卡没有6星前提下的抽卡概率
double[] p = new double[99];
double[] q = new double[99];
for(int i = 0; i< 99; ++i) {
   
	if(i < 50){
   
		p[i] = 0.02;
		q[i] = 1 - p[i];
	} else {
   
		p[i] = (i - 49) * 0.02 + 0.02;
		q[i] = 1 - p[i];
	}
}

p和q知道了,但是上面的地推公式不能用了,因为我不知道抽第n次卡的概率,也就是说我不知道抽完n-1次卡的时候,前面连续多少次抽卡没有6星。
谁说我不知道!找递推公式就是突出一个 如果我知道
P(n,k,m) 表示 抽n次卡,抽到k张6星,并且抽完这n次卡之后,刚好前面连续m次没有抽到6星。那么
m != 0 时
P(n,k,m) = P(n-1,k,m-1) * q(m-1)
m == 0 时
P(n,k,0) = P(n-1,k-1,0) * p [0] + P(n-1,k-1,1) * p(1) + P(n-1,k-1,2) * p(2) + … + P(n-1,k-1,98) * p(98)
要注意的是,如果m = 0, k = 0,就是没有抽到6星卡的时候P(n,0,0)
P(0,0,0) = 1, n>0时 P(n,0,0) = 0

double calc(int n, int k, int m){
   
	if(k == 0 && m == 0){
   
		if(n == 0) return 1;
		
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值