一、純隨機的體驗
在卡牌遊戲中,抽卡是乙個很重要的環節。對於卡池中價值較高概率較低的物品,比如設計抽出概率為5%,抽出期望次數為20次,但是實際玩家在抽的時候,大部分玩家都能在少數幾次內抽出,也有一部分玩家很多次都沒出,使得體驗上的差異較大。如果可以使玩家抽出次數的分布符合正態分佈,即絕大部分玩家都是在20次左右抽出指定道具,似乎更符合體驗的需求。
首先來看一下,設定道具a抽出的概率為5%,在純隨機下,抽出次數的分布如圖:
2020-5-20 15:30 上傳
可以看出,有5%的玩家一次就能抽出道具a,10次以內抽出的玩家達到了40%,然而50次沒有抽出的玩家也有7.7%。這很顯然對於單個玩家來說,無論是很快抽出導致後續付費下滑,還是多次不出對抽卡不滿,都並不是我們希望看到的情況。
那麼,有什麼辦法可以嘗試使玩家抽出次數的分布符合正態分佈呢?這裡我大概嘗試了兩種辦法,乙個是借鑑dota中暴擊等概率計算的prd演算法,乙個是用序列填充法。
二、prd演算法
prd演算法,是指假設暴擊的概率為20%,那麼以基礎概率c為基礎,如果沒有觸發暴擊,下一次暴擊的概率就增長為2c、3c、4c以此類推,直到觸發暴擊,則恢復基礎概率c。這種演算法可以很大程度的使得暴擊次數接近期望值,並大大減少連續暴擊或多次進攻無暴擊的情況,使得暴擊體驗符合玩家的預期。
那麼這裡,我設定道具a的抽出概率為5%,模擬計算得prd的基礎概率c為0.38%,只考慮單個物品的抽出情況,抽出道具a的次數分布如圖:
2020-5-20 15:37 上傳
可以看出,現在玩家抽出次數的分布近似於正態分佈,有70%的玩家在10-30次的時候抽出道具a,5次以內抽出和40次都沒有出的玩家都只有5%。這樣的分布使得絕大部分的玩家體驗都在乙個正常的範圍,我覺得是可行的。
但是,對於抽卡來說,乙個池子裡的道具肯定不止一種,那麼在多個道具的情況下如何處理呢?
設定池子中有5個道具,道具a、b、c抽出的概率為5%、10%、15%,道具d、e抽出概率為30%、40%,並且需要道具a、b、c的抽出次數分布均符合正態分佈。模擬計算得到道具a、b、c的prd基礎概率分別為0.38%、1.47%、3.2%,單次抽卡**如下:
2020-5-20 15:37 上傳
不要吐槽**,隨便跑跑沒有做優化
其中,b記錄了每個道具距離上次抽出後已經抽了多少次,step為每個道具的基礎概率,pro為本次抽卡中,各個道具對應的概率區間,runone返回單次抽卡結果。
抽卡100萬次,5個道具各自的抽出次數分布如圖:
2020-5-20 15:37 上傳
5個道具的實際抽出概率和期望如下:
2020-5-20 15:52 上傳
可以看出,五個道具的實際出貨概率和設計一致,a、b、c各自的抽出次數分布是大致符合正態分佈的,而d、e沒有進行prd演算法處理,抽出的曲線和純隨機的曲線一致。
所以,在乙個抽卡池中設定一定數量的特殊道具並使特殊道具的抽出次數符合正態分佈,我覺得prd演算法是可行的。當然也可以通過改進prd演算法(比如乘法換成次方)來調整使得每個道具的抽出次數正態分佈曲線更集中。在實際運用中,應該需要配置n個道具的基礎概率,配置其餘非特殊道具的普通概率,並在每一次玩家抽卡後記錄這n個道具距離上次抽出的抽卡次數。
但是,prd演算法總歸會讓最後乙個「保底」道具的抽出次數無法符合正態分佈。那麼有沒有辦法可以讓池子中所有的道具抽出次數都大致符合正態分佈呢?
三、用正態分佈進行序列填充
乙個玩家進行多次抽卡,抽出的結果可以看作乙個道具的序列,簡單列舉如下:
[a,b,a,c,d,b,e,d……]
而單個道具的抽出次數,其實可以看作序列中,每乙個道具到上乙個相同道具的距離。如果這個距離都是符合正態分佈的,那麼對於這樣乙個抽出序列,道具的抽出次數應該是符合正態分佈的。
那麼我們先考慮道具a,設定抽出概率為5%,抽出次數期望為20次,隨機生成道具a的抽出次數串行使之符合正態分佈如圖:
2020-5-20 15:37 上傳
然後,將這些抽出次數,按照順序插入玩家的抽卡序列中,由於次數符合正態分佈,那麼在抽卡序列中,抽出次數也會符合正態分佈:
2020-5-20 15:37 上傳
別吐槽圖,資料量就500個太少
對於單個物品如此計算,而如果池子中有多個物品應該怎麼處理呢?還是上面的池子,a、b、c、d、e五個道具分別對應的抽卡概率為5%、10%、15%、30%、40%。那麼根據5個道具的抽出次數期望,各生成乙個符合正態分佈的次數序列,然後按次數大小順序依次加入抽卡序列中。那麼這個抽卡序列應該是所有道具都大致符合正態分佈的。
簡單舉例:
2020-5-20 15:54 上傳
生成3個道具的次數序列,然後按照大小取抽出序列,第乙個為a,那麼a的第二個值應該加上1變成3,再和b、c進行比較,第二個依然是a,a的第三個值加上3變成8再進行比較,依次進行最後可得到抽卡序列:
2020-5-20 15:55 上傳
簡單舉例部分不懂的可問我
2020-5-20 15:37 上傳
同樣不要吐槽**qaq
count為抽卡總次數,props為道具數量,arr記錄每個道具隨機的符合正態分佈的抽卡次數,dis記錄每個道具距離上一次被抽出的抽卡次數,result記錄道具i在第j次被抽出來的結果數。
5個道具的實際抽出概率和期望如下:
2020-5-20 15:57 上傳
抽卡500萬次,5個道具各自的抽出次數分布如圖:
2020-5-20 15:37 上傳
哇哦!我們可以發現5個道具的抽出次數都是大致符合正態分佈的,概率和期望也是完全符合設計的。所以用序列填充法是可以完全做到抽卡池中的道具抽出次數都符合正態分佈。
當然,序列填充也有一定的問題,在實際運用中,除了配置每個道具各自的概率,也需要記錄玩家每一次抽卡後,池子中每乙個道具的抽卡次數隨機數,並且對於不同的玩家,需要不同的隨機種子,不然有可能所有玩家的體驗都是一模一樣的。
四、簡單總結
抽卡是卡牌遊戲的核心體驗,通過改進抽卡概率的演算法,優化單個玩家的抽卡體驗,使之符合正態分佈,prd演算法和序列填充法都是可行的。如果條件允許,從玩家的體驗出發優化概率演算法,我覺得是有意義的。
五、參考資料
標準正態分佈怎麼算 標準正態分佈函式的快速計算方法
標準正態分佈的分布函式 phi x 可以說是 資料分析師 統計計算中非常重要的乙個函式,基本上有正態分佈的地方都或多或少會用上它。在一些特定的問題中,我們 資料分析師 需要大量多次地計算這個函式的取值,比如我經常需要算正態分佈與另乙個隨機變數之和的分布,這時候就需要用到數值積分,而被積函式就包含 p...
標準正態分佈怎麼算 標準正態分佈函式的快速計算方法
標準正態分佈函式的 快速計算方法 標準正態分佈的分布函式 x x 可以說是統計計算中非 常重要的乙個函式,基本上有正態分佈的地方都或多或少會用上它。在一些特定的問題中,我們需要大量多次地計算這個函式的取值,比如我經常需要算正態分佈與另乙個隨機變數之和的分布,這時候就需 要用到數值積分,而被積函式就包...
一維 二維正態分佈概率密度曲線的繪製
在matlab中使用 y normpdf x,mu,sigma 函式求一維正態分佈的概率密度,其中x為隨機向量,mu為期望,sigma為標準差 matlab 如下 x 8 0.1 8 y1 normpdf x,0,1 期望為0,標準差為1的正態分佈 y2 normpdf x,1,2 期望為1,標準差...