正态分布某一点的概率怎么算_正态分布的抽卡概率算法
[作者:雯雯子]
一、純隨機的體驗
在卡牌游戲中,抽卡是一個很重要的環節。對于卡池中價值較高概率較低的物品,比如設計抽出概率為5%,抽出期望次數為20次,但是實際玩家在抽的時候,大部分玩家都能在少數幾次內抽出,也有一部分玩家很多次都沒出,使得體驗上的差異較大。如果可以使玩家抽出次數的分布符合正態分布,即絕大部分玩家都是在20次左右抽出指定道具,似乎更符合體驗的需求。
首先來看一下,設定道具A抽出的概率為5%,在純隨機下,抽出次數的分布如圖:
完全獨立隨機分布圖.png (16.14 KB, 下載次數: 3)
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的次數分布如圖:
PRD隨機分布圖.png (20.94 KB, 下載次數: 3)
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%,單次抽卡代碼如下:
PRDVBA.png (4.21 KB, 下載次數: 1)
2020-5-20 15:37 上傳
不要吐槽代碼,隨便跑跑沒有做優化
其中,b記錄了每個道具距離上次抽出后已經抽了多少次,step為每個道具的基礎概率,pro為本次抽卡中,各個道具對應的概率區間,runOne返回單次抽卡結果。
抽卡100萬次,5個道具各自的抽出次數分布如圖:
PRD分布圖.png (24.12 KB, 下載次數: 1)
2020-5-20 15:37 上傳
5個道具的實際抽出概率和期望如下:
PRD期望.bmp (125.29 KB, 下載次數: 2)
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的抽出次數序列使之符合正態分布如圖:
正態分布散點圖.png (48.13 KB, 下載次數: 1)
2020-5-20 15:37 上傳
然后,將這些抽出次數,按照順序插入玩家的抽卡序列中,由于次數符合正態分布,那么在抽卡序列中,抽出次數也會符合正態分布:
正態分布曲線圖.png (26.2 KB, 下載次數: 1)
2020-5-20 15:37 上傳
別吐槽圖,數據量就500個太少
對于單個物品如此計算,而如果池子中有多個物品應該怎么處理呢?還是上面的池子,A、B、C、D、E五個道具分別對應的抽卡概率為5%、10%、15%、30%、40%。那么根據5個道具的抽出次數期望,各生成一個符合正態分布的次數序列,然后按次數大小順序依次加入抽卡序列中。那么這個抽卡序列應該是所有道具都大致符合正態分布的。
這里需要注意的點是,生成的次數是距離上一次被抽出的次數,所以在每次抽出后,下一個次數應該加上上一個次數,以距離抽卡起點的次數進行比較大小。
簡單舉例:
正態分布序列1.bmp (141.56 KB, 下載次數: 0)
2020-5-20 15:54 上傳
生成3個道具的次數序列,然后按照大小取抽出序列,第一個為A,那么A的第二個值應該加上1變成3,再和B、C進行比較,第二個依然是A,A的第三個值加上3變成8再進行比較,依次進行最后可得到抽卡序列:
正態分布序列2.bmp (33.59 KB, 下載次數: 0)
2020-5-20 15:55 上傳
簡單舉例部分不懂的可問我
由于每次比較只需要一個值,我們初始只隨機一個值,然后在每次抽出后再進行下一次隨機即可。代碼如下:
正態分布代碼.png (3.65 KB, 下載次數: 0)
2020-5-20 15:37 上傳
同樣不要吐槽代碼QAQ
Count為抽卡總次數,props為道具數量,arr記錄每個道具隨機的符合正態分布的抽卡次數,dis記錄每個道具距離上一次被抽出的抽卡次數,result記錄道具i在第j次被抽出來的結果數。
5個道具的實際抽出概率和期望如下:
正態分布序列3.bmp (122.42 KB, 下載次數: 0)
2020-5-20 15:57 上傳
抽卡500萬次,5個道具各自的抽出次數分布如圖:
正態分布圖.png (27.33 KB, 下載次數: 0)
2020-5-20 15:37 上傳
哇哦!我們可以發現5個道具的抽出次數都是大致符合正態分布的,概率和期望也是完全符合設計的。所以用序列填充法是可以完全做到抽卡池中的道具抽出次數都符合正態分布。
當然,序列填充也有一定的問題,在實際運用中,除了配置每個道具各自的概率,也需要記錄玩家每一次抽卡后,池子中每一個道具的抽卡次數隨機數,并且對于不同的玩家,需要不同的隨機種子,不然有可能所有玩家的體驗都是一模一樣的。
四、簡單總結
抽卡是卡牌游戲的核心體驗,通過改進抽卡概率的算法,優化單個玩家的抽卡體驗,使之符合正態分布,PRD算法和序列填充法都是可行的。如果條件允許,從玩家的體驗出發優化概率算法,我覺得是有意義的。
五、參考資料
總結
以上是生活随笔為你收集整理的正态分布某一点的概率怎么算_正态分布的抽卡概率算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法-归并排序详细讲解(MergeS
- 下一篇: 如何对接泡椒云,给你的Auto.js脚本