如何優雅的滿足“精確到抽幾次能中”的遊戲稽核新規

近期原國家新聞出版廣電總局公佈了一條新的遊戲版號規定,在4月22號之後新遊稽核提出新的規定要求“道具抽取系統不能以抽獎概率百分比表示,必須精確到抽幾次能中”。本文介紹一種動態概率演算法,可以完美滿足此規定同時提供可控和近似純隨機的抽獎體驗。
為什麼會有這條稽核新規
4月20日,有媒體報導一條新的遊戲稽核規定:

這是自2017年5月1日規定必須公佈抽獎概率之後,監管方規範抽獎玩法的又一次嘗試。為什麼監管方不滿足於公佈中獎概率而進一步要求公佈抽獎保底次數呢?
我猜測其中部分原因是執行中公佈的中獎概率數值無法有效的檢驗真偽,導致概率公佈缺乏公信力。更重要的是公佈概率並不能有效減少玩家投入了超出預期的金錢而無法中獎的行為,沒有有效的減少監管方收到的相關投訴。
我參與運營的遊戲就曾多次因為玩家無法中獎而被投訴,監管方提供的案例中確實存在大量玩家投入了超出設計者預期數量的金錢而沒有中獎。比方,某個寶箱售價為6QB,中大獎概率為1%,預期投入為600QB中獎,但有的玩家投入了3000+還沒有中!

之所以會出現這樣的現象,是由於抽獎演算法的底層機制決定的,那就是——純隨機演算法。
純隨機能有多坑?
純隨機的概率有時候會違反直覺,比方現在有一個寶箱開出某個道具的概率是1%,那麼請問:
有100個人,每個人都開啟了100個寶箱,會有多少人能得到這個道具呢?
100個寶箱開出1個,100個人會開出100個,但是可能不會剛好一人一個,所以應該會有90人?85人?
正確答案是——63人
是的,100輪之後還有37個非酋會開不出來。我們再來猜:
如果要保證100人中有99個人獲得這個道具,需要每個人開多少個箱子?
200個?300個?正確答案是——459個
是的,純隨機就是這麼坑爹,為了保證獲得這個道具的機會超過99%,你需要開啟的箱子數是459個!甚至,無論你開啟多少個,也無法保證100%拿到這個道具:事實上,即使開啟1000個,你仍然有0.0043%的概率拿不到!你會說這個概率很小,可以忽略不計。對以一個人來說確實如此,但是當考慮海量使用者的時候,這個事情發生的數量就是必然的:
每100萬玩家中就會有43個,開1000次箱子仍然拿不到概率為1%的道具。
這時你應該能理解玩家的心情了~

為什麼會這麼坑?
要從根源上解決這個問題,首先要看看為什麼明明有100個道具,卻只有63個人能得到:
1.當第一個道具產出時,持有這個道具的人數由0個增加到了1個,這是100個人中有1個人持有,我們說新增覆蓋率為1%。
2.當第2個道具產出時,由於100個人中已經有1個人有了,這個人重複獲得這個道具的概率為1%,其他人獲得的概率為99%,也就是說預期會增加0.99個新的持有人,覆蓋率會提升到1.99%,新增覆蓋率下降到了0.99%。
3.依此類推,越到後面產出的道具就有越大的可能被已經持有的玩家得到,新增覆蓋率就會越小。
所以問題的關鍵是:隨著產出道具數量的增加,新增覆蓋率在不斷的下降,我們需要動態的增加產出概率才能使得新增覆蓋率保持穩定。
基於覆蓋率設計動態概率的思路
簡單起見,我們先假設每一輪新增覆蓋率是相同的,需要滿足的保底可以獲得的輪次命名為P,意味著每一輪都有

1.第1輪中獎概率即為

2.第2輪,當前覆蓋率為



1.第3輪,覆蓋率為


2....
3.第N輪,覆蓋率為


上述演算法即為一個可以確保玩家在P輪後全部可以中獎的抽獎演算法。不信?將代入公式

即第P輪是100%中獎的!這個世界上終於不再有非酋這樣的存在!

實用主義的優化
基於覆蓋率實現保底的原理到這裡就講完了,但是作為一個寶箱設計師,如果你直接拿這個方法去實際使用,就會隱隱覺得這個方法還是有一個小小的缺陷的:
保底的局數和第一輪的概率是固定的倒數關係,玩家從開第一個寶箱到最後一個寶箱獲得道具的效率是一樣的。但是這樣的效果不一定是最優的,也許前期獲得慢後期獲得加快的實際效果會更好呢?目前這個方法就做不到這一點,需要進行優化。
如果我們每輪畫一個矩形,表示當輪新增的覆蓋率,所有P輪會是這樣的一個形狀:

如果我們希望調整某些輪次的概率,而又要保證整體的面積之和不變,只需要改變所有矩形的高度使得矩形高度分佈在同一條直線上且中間點的高度不變即可,就像這樣:

這樣我們就得到了同樣可以在P輪之後完成100%覆蓋,但是更靈活的方法。我們在保持輪次P不變的情況下,可以在

•第1輪中獎概率為K。
•第2輪的概率參照之前的計算方法,本輪概率=新增覆蓋率/未中獎概率。

1.參照上方圖片,第2輪的新增覆蓋率為


2.下面求解





3.第二輪概率為

•第N輪的概率計算如下:

1.參照上方圖片,本輪新增的覆蓋率


2.本輪的未中獎概率為


拿

*其中:K為首輪概率、P為保底獲得輪次、N為連續未抽中輪次
PS.這個公式雖然看上去很複雜,但只涉及基礎的加減乘除運算,程式實現時真正的挑戰在於如何儲存玩家的中獎狀態,所以相對於上一部分中只能指定保底輪次的方案,優化為可以調整初始概率方案的價效比很高。
實際效果如何
為了模擬實際使用時的體驗,我設計了一個演示Excel文件,表格中演示了在演算法設定保底100輪抽中,首輪概率為0.5%的情況下,玩家抽中則停止、抽不中則繼續抽,從第1輪到第100輪的中獎概率和所有玩家中獎的覆蓋情況。
最終計算結果如下:

可以看到每輪的概率和新增覆蓋率如下:

這個演算法可以同時達到3個目的:
1.最後一輪的概率為100%,且輪次數量可以指定。這樣就不可能出現超過保底輪次依然沒有抽中的現象,避免玩家陷入臉黑的困境,可以完美滿足監管方要求明確說明幾輪可以抽中的要求。
2.第一輪的概率是0.5%,此值的取值範圍是0%~2%的任意值。在實際應用中,大部分的玩家會停留在前幾輪,可調的首輪概率能有效控制不同型別玩家的獲取能力。
3.每一輪的新增覆蓋率是一個等差數列,此數列之和為1。這樣的好處是使得每一輪抽中的機會是逐漸變化的、不會出現跳躍式的突變,從而使得抽獎的體驗更加接近真實隨機,提升抽獎的體驗、避免被玩家抓到漏洞。
結語
本文介紹了一種通過動態調整中獎概率確保在指定輪次內必定中獎且輪次和首輪中獎概率可單獨配置的動態概率演算法,在滿足監管要求的基礎上使得中獎體驗更接近真實隨機,在寶箱售賣或掉落系統中均有一定的實用價值。
此演算法原理有點複雜,16年我推匯出來之後,僅在寶箱掉落系統有過實際應用,一直沒能推廣到寶箱售賣系統中,歡迎做第一個吃螃蟹的人~

有任何問題,請新增微信交流:

作者:李榭恆
專欄地址:https://zhuanlan.zhihu.com/p/67252977
相關文章
- 如何利用資料優化遊戲中的抽獎活動優化遊戲
- 遊戲圈精細化運營,看網易大神如何滿足100+種遊戲使用者的需求遊戲
- 如何優雅的移植JavaScript元件到BlazorJavaScript元件Blazor
- 如何優雅的升級到webpack4Web
- React中如何優雅的使用UEditorReact
- 總有一種啤酒能滿足你的味蕾!
- 《動物餐廳》湯庭泉:如何優雅的實現遊戲調優遊戲
- 如何在遊戲設計中實現優雅藝術?從流程解析到具體例項遊戲設計
- 遊戲審批規則變動:限制每日抽取次數,十連抽最多3次遊戲
- 我們是如何將史上最優雅的武器做進遊戲裡的?遊戲
- 打造最好的智慧邊緣,你滿足了幾點
- 如何在 React 中優雅的使用 addEventListenerReactdev
- 遊戲如何長效且優雅地蹭熱點?遊戲
- 如何優雅的搞垮伺服器,再優雅的救活伺服器
- 手寫實現滿足 Promise/A+ 規範的 PromisePromise
- 實戰:如何優雅的從 Skywalking 切換到 OpenTelemetry
- 如何優雅的在flask中記錄logFlask
- kafka的至少一次和精確一次Kafka
- 遊戲互動設計中的抽獎感受研究遊戲
- 如何優雅的使用介面
- 如何優雅的寫Markdown
- 如何優雅的使用MyBatis?MyBatis
- 不管你需求如何,BenQ PD2700U總能滿足你ENQ
- 2019中國遊戲行業大事記:超1.8萬家遊戲公司倒閉,遊戲版號基本滿足需求遊戲行業
- 去繁從簡追求純粹滿足,“刷刷刷”遊戲的生存之道遊戲
- 如何優雅的替換掉程式碼中的ifelse
- 程式中的敏感資訊如何優雅的處理?
- 在React專案中,如何優雅的優化長列表React優化
- 幾個優雅的JavaScript運算子使用技巧JavaScript
- [WebAssembly 入門] 實現數獨遊戲 - 如何優雅的組織Rust程式碼Web遊戲Rust
- 如何在vue專案中優雅的使用SVGVueSVG
- Spring中如何優雅的使用監聽器模式Spring模式
- 如何在React中優雅的使用Interval(輪詢)React
- 教你如何優雅處理Golang中的異常Golang
- Mybatis 中如何優雅的增強日誌功能?MyBatis
- 如何滿足商業區的無線覆蓋
- 如何滿足商業區的無線覆蓋?
- 如何優雅的修改node_modules中的依賴庫