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
准初一新生微弱作答
最后一題中,並沒有給出單張橙卡實際價值,但我們依然需要先算出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點(若不計成本只為品牌宣傳等復雜情況不作討論了,此題僅從日常盈利的角度思考)
Posted by: Xagorz | (30) August 6, 2019 07:22 PM
1. 通俗點講是 如果我前10次沒有抽上, 會給我一個橙卡。 如果我抽上了 那就不保底了。。 而前10次的價值是1張橙卡。 所以總共就一張橙卡的價值。。
2. 公式是 pow(0.9, 10) * 1張橙卡 + (1-pow(0.9 ,10)) * ((0.1 * 1張橙卡)* 10)
所以最后的價值是 1 張橙卡
Posted by: kk | (29) January 22, 2019 05:15 PM
1. 通俗點講是 如果我前10次沒有抽上, 會給我一個橙卡。 如果我抽上了 那就不保底了。。 而前10次的價值是1張橙卡。 所以總共就一張橙卡的價值。。
2. 公式是 (1-pow(0.9, 10)) * 1張橙卡 + pow(0.9 * 10) * ((0.1 * 1張橙卡)* 10)
所以最后的價值是 1 張橙卡
Posted by: kk | (28) January 22, 2019 05:13 PM
文末的題
實際橙卡期望E約等於
6.5
所以價值(1*10)*(10/6.5)≈15.4
應屆數值,歡迎討論
Posted by: 韓毛毛 | (27) October 10, 2018 10:46 PM
對於我來說一文不值~
Posted by: aka | (26) July 23, 2018 05:38 PM
網易的陰陽師完了一年多,ssr抽卡概率百分之一,滿級60級,52級第一個ssr,也就是之前300多抽沒有ssr,非酋的計算重置,然后直到我第599抽出了第二個ssr,600抽無ssr最高非酋獎勵的,百分之一的概率599抽才抽到,然后我就退游了,很好奇陰陽師的抽卡規則,雖然說沒有保底才有肯能達成成就,但是這中途必定會流失大部分玩家
Posted by: 陰陽師非洲大酋長 | (25) June 28, 2018 10:33 AM
這個卡包價值不就是10塊嗎?
Posted by: yolk | (24) March 8, 2018 09:02 PM
不要為自己不想花精力學數學找借口 :D
這跟我現在程序寫不好,但是我轉管理就能做好一個意思。
我不需要學心理學,因為我能洞悉人的心理;我智商不高,但是我情商高啊。
Posted by: Cloud | (23) February 26, 2018 08:34 PM
1、數值策划要保證的是最終體驗結果好,而不是數學能力有多強。從數值策划的角度來考慮,我會考慮除了有保底以外,是否還有保高(懲橙卡投放總量是否限制),是針對單玩家設置保高,還是一個范圍內的保高。更極致點的甚至是給玩家打標簽(比如付費額度),不同規則對不同群體的人生效,種種規則下來才能得到一個價格。
2、從體驗來說,是否允許玩家十連能出多張橙卡的規則很關鍵,這會影響到開獎方式的展現,換言之是是否希望對於抽獎有期待感,還是當成明碼標價來買東西。如果不允許,那么那么對於玩家來說就是你在直接賣東西給他,十連一定有一張橙卡,他根本也不關心是第幾張出的橙,即使一張出橙,那么他也知道剩下的絕對不會有橙了,根本沒期待感,體驗也不會好。這個前提下,設計什么分布都沒有用,玩家感受肯定是不好的。如果你允許玩家10連出多張橙卡,那么相應的十連就應該是一張一張翻卡的過程,因為對於玩家來說每次翻牌都有可能出橙卡。程序應該先按標准流程后端走一遍抽獎,如果玩家沒有抽中,就塞給他一張,隨機插入在10張牌的任一順序內,這樣玩家也不會覺得保底每次都是最后一張,像是安排好的一樣。
3、最后這個題目只能說是驗證一個數值策划的數學能力。在開發當中,策划應該是先定價值,然后反推投放方式,倒過來的話單純只能考驗策划的數學能力而不是數值能力。(PS,這問題我不會,高數連補了四年,大四才補考合格)
Posted by: 蟈蟈 | (22) February 26, 2018 08:11 PM
我很好奇,這個數值為什么大家寫的那么復雜
首先如果是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塊錢啊...
在學習數值的菜雞留言
如果有正確答案請給我一個參考一下,諸君寫了一堆數值一堆算式,可是我感覺除了陽光宅男的說法,其他諸位除了展示自己數學水平,根本沒有任何用啊......
Posted by: yige819 | (21) December 21, 2017 05:55 AM
試着做一下最后那道題:
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上,感覺是以一個指數分布疊加在另一個指數分布上,變成另一種更復雜的分布。