« 豆豆的日常 | 返回首页 | 一个简单的 lua 对象回收再利用方案 »

10 连抽保底的概率模型

网游里有很多抽卡、开箱子之类的赌性玩法,在最开始,游戏设计者实现的时候,仅仅给这些抽取概率简单的设置了一个值。比如抽卡抽出橙卡的概率是 10% ,那么就是说,玩家每次抽一张卡,有 90% 的可能是白卡,10% 的可能是橙卡。

但大 R 玩家是大爷,需要小心伺候。如果感受不好,人跑了就亏大了。概率这个东西靠改进伪随机数发生器是解决不了体验问题的,大爷要是连抽 20 张都出不来橙卡,那是要怒删游戏的。

连抽 20 张 10% 概率橙卡一张都抽不到的机会多不?一张抽不中的概率是 0.9 ,20 张都抽不中的概率是 0.9 ^20 = 12.2% 。这可不算小数字啊。平均 8 个大 R 就会碰到一次,一下子赶跑了 1/8 的金主,这个责任小策划可担当不起。

所以、一般网游都会用各种规则来避免玩家出现连抽不中的尴尬。例如,我忘记是谁发明的 10 连抽规则:如果你购买一个大包连抽 10 次,我在规则上就保证里面一定至少有一张橙卡。实现它应该并不困难,按常规概率生成 10 张的卡包,如果里面没有橙卡,那么我加一张即可。

但如果我想把 10 抽保底的规则惠及日常抽卡的玩家该怎么做呢?

就是说,我希望任何玩家任何时候,接连抽了 10 张卡,我都想保证这 10 张卡里至少有一张橙卡。

首先,要说明的一点:如果你同时想保证橙卡掉落率是 10% ,也就是在极大范围内,比如系统投放了一万张卡片中,其中要有一千张橙卡。那么同时保证每 10 张卡里有至少一张橙卡的话,结果一定是完全不随机的,也就是必须每抽 9 张白卡,必出一张橙卡。

所以、如果即想要随机(出橙卡的概率稳定),又想有 10 张出一张的保底,那么橙卡投放量是一定超过 1/10 的。

我们之前的游戏用了个很粗暴的方案:记录玩家已经连续几次没有抽中,如果连续次数超过 9 ,就必给他一张橙卡。为什么我说这个方案粗暴,因为它其实破坏了抽卡的自然体验。虽然玩家的确更高兴了,但是概率却很不自然。不自然的方案(其实是生硬的打了个补丁)实现起来还容易出错,我们前段时间就因为实现 bug 多发放了很多稀有物品,这个 bug 就不展开说了。

下面来看看,为什么这么做不自然。

假设橙卡的掉率是 10% ,那么你在获得一张橙卡后,再抽下一张橙卡的概率就是 0.1 。下一张是白卡,再下一张是橙卡的概率是 0.9 * 0.1 ,下两张是白卡,第三张是橙卡的概率是 0.9^2 * 0.1 ……

后续有 10 张及 10 张以上的概率总共有多少呢?我算了一下,大约是 35% 左右。

我们把抽到两张橙卡之间会抽取到的白卡张数排成一个数列的话,这个数列的值的范围是 0 到正无穷。是的,非洲酋长可能永远抽不到橙卡。当然这只是理论值。

如果你读过大学,学的是理工科,没有逃课的话,就应该知道,这个数列是大致符合指数分布的。指数分布正是用来表示独立随机事件发生的时间间隔的。

当我们把这个数列中大于 9 的数字都强行改成 9 ,那么 9 的出现频率就陡然跳变,这是极不自然的。(分布不平滑)


从一致分布的随机数,转换为指数分布的随机数非常简单。如果你懒得自己推导,那么可以在爆栈网上找到公式

让我们回答前面的问题,如果我希望获得一个大约每 10 张卡里出一张橙卡的随机数列,除了每次 random 一个 [0,10) 的整数,判断证书是不是 0 以外,还有一个方法。那就是每次抽到一个橙卡后,都从一个指数分布的随机数列中取一个值出来,作为接下来会抽取到白卡的张数。按这个张数去发放白卡,等计数器减到 0 ,就发一张橙卡给玩家。这个白卡张数的数值范围是 [0, inf) 。

用 lua 实现的话,大概是这样的:

math.floor(math.log(1-math.random()) * (-rate)) 其中 rate = 10 。

好了,如果我们想加上 10 张保底,又想让间隔大致符合指数分布怎么办?简单:

function erand(rate)
    while true do
        local p = math.floor(math.log(1-math.random()) * (-rate))
        if p < rate then
            return p
        end
    end
end

让产生出来的数字小于 10 的时候重来一次就好了。如果你担心这里死循环(实际并不会),也可以加上循环上限:

function erand(rate)
    for i = 1, 100 do  -- 100 可以随便写
        local p = math.floor(math.log(1-math.random()) * (-rate))
        if p < rate then
            return p
        end
    end
    return rate-1
end

当然,一旦加上了 10 张保底,单张出橙卡的概率就大大增加了,增加到多少呢?大约是 21%。如果你希望保持 10% 左右的投放率,那么保底张数大约应该设置在 23 张左右。


ps. 今天在公司群里讨论这个问题时,雷先生提了这么一个问题,说是可以用来做数值策划的面试题:

已知橙卡的抽取率是 10% ,抽一次卡是 1 块钱;而 10 连抽的包可以帮你按同样概率连抽 10 次,但如果没有抽到橙卡的话,系统会补偿一张橙卡给你,换掉 10 张白卡中的一张。

假设白色一文不值,只有橙卡值钱。

那么请问:这个 10 连抽的包到底价值多少?

Comments

没什么好争的,2个答案都是对的,只是出题的人没有说清楚条件罢了。

1.每次十连一次结算,多次十连间互不影响
p=1╱10,q=9╱10,n=10
十连出货
E=np+1×(9╱10)^10≈1.35
十连价值=1.35*10=13.5

2.多次十连间相互影响,保证两次橙色卡间白卡数小于9
十连出货次数
p(i)为第i次出货的概率
E=1*p(1)+2*p(2)+......+10*p(10)≈6.5
十连价值=(1*10)*(10/6.5)≈15.4

ps:这种问题我还见过更奇葩的,十连出货率为10%,第十次不出有保底,最后问十连价值,开始以为听错了,一再确认后发现这10%还真是十连,不是单抽,这。。。。。。

单抽=1元=10%*橙卡
保底=90%^10=34.8%*橙卡

价值=保底/单抽=3.48元

准初一新生微弱作答
最后一题中,并没有给出单张橙卡实际价值,但我们依然需要先算出10次抽奖平均能得到多少张橙卡。注意一点,题目允许玩家10连抽不止得1张橙卡,只是10次都没得到的情况下才送1张橙卡

住:COMBIN(x,y)是EXCEL里组合函数公式,代表x次中取y次的情况,下文表示10次里选N次中

构建10次保底的分布律(中1-10次)。只中1次有些特殊,概率为全都不中(保底情况)+正常中一次=0.9^10+COMBIN(10,1)×0.9^9×0.1;中N次的概率为COMBIN(10,N)×0.9^(10-N)×0.1^N

上述分布律期望计算约为1.35,即10连抽平均可得1.35张橙卡,答案也即1.35张橙卡的价值;我通过EXCEL的VBA进行了验证,按题目所述形式实验后的概率符合上述结果;另外有人提到单人参与和群体参与时概率分布不一样,就题目而言我个人认为没有抽水、限量、库存等设计形式下,1.35张橙卡价值绝对是标准答案

最后,橙卡的人民币价值,个人认为是围绕业务性质、公司规则下的一个开放式答案:
1.以用户保值角度出发,10连抽消费10元,则1.35×单卡价值=10,得单张橙卡价值为¥7.4
2.以公司盈利角度出发,10连抽盈利10元,分x∈[0,1]的比例给玩家,则1.35×单卡价值=10×x
按上文的来算,有答案是10连抽价值13.5元则公司亏3.5元、15.4元则公司亏5.4元;假设抛出研发成本、税费等取x=0.5,则单卡价值3.7元

因此,若奖品为虚拟物品,则可从保值或溢价的角度计算价值,毕竟兑换不了真钱,你说这个物品价值1000元都行(大家都懂很多广告里那些价值X元的套餐吧?)、若奖品为实物奖品,则价值应偏向于第2点(若不计成本只为品牌宣传等复杂情况不作讨论了,此题仅从日常盈利的角度思考)


1. 通俗点讲是 如果我前10次没有抽上, 会给我一个橙卡。 如果我抽上了 那就不保底了。。 而前10次的价值是1张橙卡。 所以总共就一张橙卡的价值。。

2. 公式是 pow(0.9, 10) * 1张橙卡 + (1-pow(0.9 ,10)) * ((0.1 * 1张橙卡)* 10)

所以最后的价值是 1 张橙卡

1. 通俗点讲是 如果我前10次没有抽上, 会给我一个橙卡。 如果我抽上了 那就不保底了。。 而前10次的价值是1张橙卡。 所以总共就一张橙卡的价值。。

2. 公式是 (1-pow(0.9, 10)) * 1张橙卡 + pow(0.9 * 10) * ((0.1 * 1张橙卡)* 10)

所以最后的价值是 1 张橙卡

文末的题
实际橙卡期望E约等于
6.5

所以价值(1*10)*(10/6.5)≈15.4
应届数值,欢迎讨论

对于我来说一文不值~

网易的阴阳师完了一年多,ssr抽卡概率百分之一,满级60级,52级第一个ssr,也就是之前300多抽没有ssr,非酋的计算重置,然后直到我第599抽出了第二个ssr,600抽无ssr最高非酋奖励的,百分之一的概率599抽才抽到,然后我就退游了,很好奇阴阳师的抽卡规则,虽然说没有保底才有肯能达成成就,但是这中途必定会流失大部分玩家

这个卡包价值不就是10块吗?

不要为自己不想花精力学数学找借口 :D

这跟我现在程序写不好,但是我转管理就能做好一个意思。

我不需要学心理学,因为我能洞悉人的心理;我智商不高,但是我情商高啊。

1、数值策划要保证的是最终体验结果好,而不是数学能力有多强。从数值策划的角度来考虑,我会考虑除了有保底以外,是否还有保高(惩橙卡投放总量是否限制),是针对单玩家设置保高,还是一个范围内的保高。更极致点的甚至是给玩家打标签(比如付费额度),不同规则对不同群体的人生效,种种规则下来才能得到一个价格。
2、从体验来说,是否允许玩家十连能出多张橙卡的规则很关键,这会影响到开奖方式的展现,换言之是是否希望对于抽奖有期待感,还是当成明码标价来买东西。如果不允许,那么那么对于玩家来说就是你在直接卖东西给他,十连一定有一张橙卡,他根本也不关心是第几张出的橙,即使一张出橙,那么他也知道剩下的绝对不会有橙了,根本没期待感,体验也不会好。这个前提下,设计什么分布都没有用,玩家感受肯定是不好的。如果你允许玩家10连出多张橙卡,那么相应的十连就应该是一张一张翻卡的过程,因为对于玩家来说每次翻牌都有可能出橙卡。程序应该先按标准流程后端走一遍抽奖,如果玩家没有抽中,就塞给他一张,随机插入在10张牌的任一顺序内,这样玩家也不会觉得保底每次都是最后一张,像是安排好的一样。
3、最后这个题目只能说是验证一个数值策划的数学能力。在开发当中,策划应该是先定价值,然后反推投放方式,倒过来的话单纯只能考验策划的数学能力而不是数值能力。(PS,这问题我不会,高数连补了四年,大四才补考合格)

我很好奇,这个数值为什么大家写的那么复杂
首先如果是10%抽取,
那么每次抽取都会有概率获得价值X块钱的橙卡或者损失1块钱抽卡成本
然后就很容易理解了
既然有保底橙卡,那么我们可以理解为
这个10连抽是10块钱代价去拿到最少1张X元钱的橙卡
而从没有保底的概率判断,如果是每次90%都拿不到橙卡的话,连续十次拿不到的概率是0.348
那么换言之这个保底行为价值10元*0.348
然后单抽成本本身价值10块钱
那么这个礼包价格最低可以设计成10+3.48元,大概13.5是一个"保值"价格(从等价交易原则来看)
如果从玩家角度,你10连抽给不给保底我不管,而且大多游戏都是给保底的(如同潜规则一样)
那么10次抽奖礼包=10块钱,每次花1块钱抽奖,你为了鼓励消费,来了个10元抽奖保底原则
那么实际价值就该是10块钱啊...

在学习数值的菜鸡留言
如果有正确答案请给我一个参考一下,诸君写了一堆数值一堆算式,可是我感觉除了阳光宅男的说法,其他诸位除了展示自己数学水平,根本没有任何用啊......

试着做一下最后那道题:
1,10连抽正常概率下,大概35%会不出橙卡,剩下65%会出橙卡(这部分和保底无关)
2,即系统有35%的概率多发一张橙卡
3,例如:我们抽了100次10连抽,共100次,则总共会抽出135张橙卡,一张橙卡的价值是10元,则十连抽的包的价值为13.5元
欢迎讨论~~~

对于10连抽这个问题首先你确定服务器给的概率是对的吗,如果只有一个人在抽,那没有问题,随机分布的比较均匀,如果多个人在抽,有人抽走了橙卡,另外的人概率就会变了。所以每个人有自己的随机种子,每个人都有自己的随机分布,这样可以保证0.35的期望,而不会遇到有的人运气超好,把把橙卡,有的人运气特别背,永远抽不出来。然后最后一把补一张橙卡,这是有问题的,失去赌博的随机性,橙卡是事先补好的,最后一把补,意味着与前面9把的概率不一样了,要做到每一把的概率都一样,事先就补好,随到10把都没有橙卡,就会有一张补进去,那怎么事先知道呢,因为有随机种子,就能事先算出来。那出橙卡的那一次就可以不在最后一次里面,正真做到1.35期望,也就解答了最后到底值多钱。按你的做法虽然值1.35,但是不是均匀分布在10连抽中的

很尴尬。。算错了,然后想错了。。

随着抽卡的次数增多,玩家的收益其实是边际效益递减的。
抽1次卡 橙卡的期望值是0.1张
抽2次卡 橙卡的期望值是0.19张
抽3次卡 橙卡的期望值是0.282张

所以金钱并不和橙卡的数量直接挂钩,而是和出橙卡的概率直接挂钩,借用楼上的期望1.348 , 我们要找到的是
抽N次卡 橙卡的期望值是1.348 其中N的数值,而不能直接由一次抽卡的期望直接换算

原来概率p1 = 10%
保底概率p2 = 0.9^10 ≈ 35%
橙卡概率p = p1 + p2 = 45%
所求价值v = 10 * p = 4.5¥

前提:10%是真概率

十连抽的保底期望是抽到1.3486784401张橙卡。

10%的单抽概率抽到橙卡,单抽一次一块钱,推出橙卡价格是10块钱。

那样十连抽的价值就是13.5块,但是实际出售价格应该还是设置为10块吧。

如果要抽n次掉落1个装备的话,根据war3掉金币的算法是:
第一次掉落概率:k
第二次掉落概率:2k
第三次掉落概率:3k
……

算一下期望就是:
k * 1 + (1 - k) * 2k * 2 + (1 - k) * (1 - 2k) * 3k * 3 + ... = n

可以策划去配置这个n,然后程序二分k的数值把k算出来

以n = 10为例,k = 0.014746
抽第一次的概率是:1.4746%
第二次:2.9492%
第三次:4.4238%
第四次:5.8984%
第五次:7.373%
第六次:8.8476%
第七次:10.3222%
第八次:11.7968%
第九次:13.2714%
第十次:14.746%
结合实际应用来看,再加上一点特殊处理:
1,如果前九次不中,第十次必中
2,如果前面有中的,后面一定不中

以上适用于单次单次的抽,可以给用户一个较好的体验。如果是十连抽的话,可以有更简单的实现方式了。

我闻到了一丝坏味道。

1*0.1^1*0.9^9+
2*0.1^2*0.9^8+
3*0.1^3*0.9^7+
...
+9*0.1^9*0.9^1+
1*0.9^10

不知道对不对……

保底的几率是0.348左右,答案是1.348吧

我明白了,你这个相当于先模拟抽,超出23次不中的就扔掉。其实就相当于保底23次。
ps. 指数分布/泊松分布可以由二项分布推导出来,可以说它们描述的是二项分布的另一面(这里用泊松分布可能更符合你的要求,因为是离散的)
ps.. 最后那道题,是不是该换一种问法:一张橙卡价值几何

一个小结果,没有保底发放100张卡,有10张橙卡,有保底的就会大概是15张橙卡。
假设有100个人 每个人都一直抽到橙卡为止 会出现oranCard张橙卡 whiteCard张白卡 一共oranCard + whiteCard张卡:

橙卡:100
白卡:551.3215599
橙卡/(橙卡+白卡):0.15353399327876
没有保底的话 橙卡/(橙卡+白卡)=0.1

想确认下计算方法是不是我假设1000次抽取样本中,10连抽中白卡的概率为31.8%,可以理解为只要设了10连保底,那么就有31.8%的概率出橙卡,同时加上10%本身产出的概率,所以就有41.8%的概率产出橙卡。所以包的价值为0.418乘以橙卡单价。

@tuan

无论什么方法,都是觉得简单的在保底最后一次硬送过于粗暴,失去了赌性的乐趣。希望对此改进。

对于成功率递增的方法,我觉得最终的期望次数一定不是 N 。当然这没有问题。

我想如果有问题的话,应该在于先期的成功概率也被降低了。也就是连抽中的惊喜事件频率会比完全独立抽取(最终期望一致的情况下)发生的概率大大降低。

从体验角度说,我们不仅要避免大 R 当非洲酋长,也不能减少他们当欧皇的概率。

∵ 橙卡的概率是10%,抽一次卡是1块钱
∴ 橙卡值10块
且 抽10次且没有概率保护,价值就是10块
∵ 10次不中概率是pow(0.9,10)=0.35
∴ 0.35的概率额外获得一张橙卡
∴ 因为概率保护而获得的收益是0.35*10=3.5
∴ 10 连抽的包值13.5


这不是纯数学题么

@arnan

应该就是把前面各乘了 1.35 。严格说,间隔本不完全是指数分布,它是离散的。

招数值吗?这题我会做,我是失业数值……

以前做过类似的,比如装备强化,成功率逐渐升高。第i次的成功率为1/(2*N-i),则次数期望是N。相当于一个期望是N次的操作,保护2N-1次必定成功,简单明了。

想了想,加上这个while之后其实就不是指数分布了。
相当于也是把10之后的35%概率硬砍掉了,只是不是简单的加在9上,感觉是以一个指数分布叠加在另一个指数分布上,变成另一种更复杂的分布。

Post a comment

非这个主题相关的留言请到:留言本