抽卡機制分析工具分享

前言
????????憑興趣研究原神抽卡系統(tǒng)的設(shè)計也有一段時間了,這里分享一下我的一些研究方法。本文提到的方法都是很經(jīng)典且通用的方法,可以解決各類實際問題,當然也可以用于設(shè)計游戲的各種數(shù)值系統(tǒng)。由于我數(shù)學不是很好,所以行文難免冗長,請多多包涵。
*本文提及的綜合概率意為抽卡次數(shù)趨于無窮時,抽出來的物品比上總抽數(shù)的比值。
數(shù)據(jù)獲取
????????對于統(tǒng)計分析工作,無論使用的方法有多先進,一份來源可靠且數(shù)量足夠的數(shù)據(jù)都是必須的。我嘗試過通過收集身邊人的抽卡記錄、看主播抽卡視頻、彈幕收集出貨記錄等方法來收集數(shù)據(jù),這些辦法效率都比較低,并且收集到的數(shù)據(jù)準確度存疑。后來得益于一些抽卡記錄導出工具,我得以獲取大量詳細且無錯誤的抽卡記錄,我已經(jīng)將獲得的抽卡記錄放在GitHub上的GI_gacha_dataset項目中。
數(shù)據(jù)處理
1.?選取最佳估計值
????????如果你已經(jīng)得到了大量數(shù)據(jù),怎樣估計抽卡系統(tǒng)的概率呢?拿原神的抽卡系統(tǒng)舉例,由于五星90抽保底,如果當前統(tǒng)計的五星道具獲取抽數(shù)+此后記錄中剩余抽數(shù)不足90抽,則應該舍去本次記錄。在保留的記錄中取每次獲取五星物品時使用的抽數(shù)作為參考抽數(shù),將保留記錄中五星總數(shù)比上參考抽數(shù)的比值作為綜合概率的估計量。
????????為什么要這樣呢?舉個簡單的例子,若收集到的數(shù)據(jù)中每個玩家只抽了十次,都沒有觸發(fā)抽卡概率上升段。按照總抽出五星數(shù)比上總抽數(shù)得到的值,隨著收集到的數(shù)據(jù)增加,是趨于0.6%而不是1.6%的。由于玩家總抽數(shù)是有限的,所以根據(jù)保底抽數(shù)舍去部分記錄才可以保證無偏記錄。因此,分析各種抽卡系統(tǒng)都要恰當?shù)倪x取綜合概率估計量,否則得到的結(jié)果會是有偏的。
2.?繪制分布圖
????????很多信息被隱藏在分布中,分布刻畫了比均值、方差這些統(tǒng)計量多得多的信息,同時分布也能夠幫助你在噪聲中提取信息。多繪制分布圖可以找出不同模型間細微的差距。
模型綜合概率評估方法
????????為了保證玩家的抽卡體驗,現(xiàn)在的抽卡機制都會比較復雜,其綜合概率難以簡單的直接算出,因此在設(shè)計這類抽卡機制時需要借助其他工具輔助計算概率。
1.?蒙特卡洛模擬法
????????又稱統(tǒng)計試驗法,思想是通過對某一隨機事件進行大量模擬,以隨機事件出現(xiàn)的頻率估計其概率。此方法優(yōu)點是能夠解決有統(tǒng)計性質(zhì)的問題,相較于其他方法可以快速估算十分復雜的模型的概率。缺點是隨機模擬始終有誤差,不能得到精確值,想要提高精度時計算量大。
舉例:現(xiàn)有一抽卡模型,抽到某物品的概率初始為1%,每次抽卡沒有抽到此物品時,下次抽到本物品的概率上升1%,抽到了此物品時下次抽卡抽到此物品的概率重置為0。問抽到特定物品的綜合概率是多少?
????????最樸素的想法是模擬抽一千萬次,觀察抽取物品出現(xiàn)的頻率,用頻率來估計綜合概率。
????????運行一次代碼,模擬一千萬次抽卡后,一共抽到了819161次物品,認為綜合概率約8.19%
????????但是由于隨機性,每次運行得到的值都會不一樣。樸素的做法無法得知估計概率的精確度如何,這個時候需要對樸素的方法進行改進。尋找一個滿足重復試驗獨立同分布的隨機變量以應用大數(shù)定律,這里選取抽到物品需要的抽數(shù)。抽取很多次物品,每次抽到物品花費的抽數(shù)是獨立同分布的隨機變量序列,可對其運用中心極限定理獲知花費抽數(shù)的平均值近似于服從正態(tài)分布。
????????以上代碼具體說明略。運行以上代碼,給出了一個8.187%到 8.203%的區(qū)間,實際值落在這個區(qū)間內(nèi)的可能性約為95%,雖然每次運行得到的區(qū)間會不一樣,但是我們知道了得到數(shù)字的置信水平。要提高模擬的精度實際上就是減小這個區(qū)間的長度。由中心極限定理,要讓區(qū)間縮小十倍,模擬次數(shù)需要變?yōu)樵镜囊话俦?,因此想要提高模擬值的精度計算開銷很大。
2.?使用期望計算綜合概率
????????隨機變量的數(shù)學期望又稱均值,對于離散的變量X其期望為
舉例:同樣對于以上模型,用數(shù)學期望計算綜合概率。
????????設(shè)在第i抽抽到物品的概率為。由于抽卡規(guī)則保證依照數(shù)學期望的定義,抽到物品花費的平均抽數(shù)為
,取期望抽數(shù)的倒數(shù)
即是綜合概率。
????????計算得此模型抽到物品的綜合概率為8.19003%,這個值的誤差只取決于計算機浮點誤差。
3.?使用概率轉(zhuǎn)移矩陣計算概率
????????很多復雜的模型期望難算,并不適合采用期望去計算綜合概率。
????????網(wǎng)友Labrarinth指出可以使用概率轉(zhuǎn)移矩陣計算,這個方法非常經(jīng)典且通用,概念更明確直觀,并能處理較復雜的問題。
舉例:現(xiàn)有一抽卡模型有A/B兩種物品,A物品的初始概率為50%,B物品的初始概率為10%。當上一次沒有抽到A物品時,本次一定能抽到A物品。問抽到A/B物品的綜合概率各是多少?
????????這個抽卡模型滿足一階馬爾科夫性質(zhì),每次抽卡抽到特定物品的概率只和前一次抽卡有關(guān)。

????????可以畫出狀態(tài)轉(zhuǎn)移圖

????????設(shè)某時刻的狀態(tài)可以用一個向量來表示,其中
表示本抽抽到A物品的概率,
表示本抽抽到B物品的概率,
表示本抽沒抽到的概率,則下一個時刻的狀態(tài)向量
????????想要知道抽數(shù)趨于無窮時的綜合概率,即求中
及
的值。由于馬爾科夫概率轉(zhuǎn)移矩陣最大特征值為1,當概率轉(zhuǎn)移矩陣相乘次數(shù)趨于無窮時,趨于取特征值1對應的特征向量
,
即是A/B對應的綜合概率。
????????計算可知A物品的綜合概率為2/3,B物品的綜合概率為1/15。
4.?動態(tài)規(guī)劃
????????動態(tài)規(guī)劃也是一種常用的方法。在這里動態(tài)規(guī)劃的方法和概率轉(zhuǎn)移矩陣的方法本質(zhì)上是相同的,都是依賴某時刻的抽卡結(jié)果僅和過去的抽卡結(jié)果相關(guān)的性質(zhì)。不同之處是動態(tài)規(guī)劃可以更自由的設(shè)計狀態(tài),研究復雜的問題。
舉例:對于以上模型,計算第5次抽卡后抽到至少4個A物品的概率。
????????定義狀態(tài)表示第i次抽卡后抽到了A物品,并累計抽到了j個A物品的狀態(tài),
表示第i次抽卡后沒有抽到A物品,但累計抽到了j個A物品的狀態(tài)。
????????寫出狀態(tài)轉(zhuǎn)移方程:
????????置初始狀態(tài)S[0][0][1]=1,進行遞推后取出S[5][4][1]、S[5][5][1]、S[5][4][0]之和0.3125即為所求。