策劃解讀:關於“暴擊”的誤解與數值的“偽隨機”
https://www.zhihu.com/question/359672217/answer/929611536
在數學上90%機率是指無限多次的實驗嘗試中,單次獨立事件發生率為90%。
在遊戲裡玩家會有另一層理解(錯誤的常識):在有限多次的嘗試中,事件總髮生率為90%,也就是說10次裡一定要接近9次發生。
對於那些對數理邏輯不敏感的人士,會天然的將概率這種概念,在有限次實驗內感性的放大。
但有意思的是,遊戲數值設計者在大多數遊戲(賭博遊戲等真隨機遊戲除外)的設計過程中,並沒有檢視糾正玩家的理解錯誤,反而去迎合了這種理解錯誤。
也就是說,遊戲數值中的概率,大多數是反真實概率的,目的是為了讓玩家認為自己感知的就是正確的。在某種意義上這確實是件吊櫃的事情,但在遊戲設計理論裡,這是一種正常現象。
遊戲體驗必須以玩家為準,如果以數學家為準,很多反直覺毀三觀的真實理論反而會影響遊戲體驗(畢竟玩遊戲不是搞理論學術,重點是開心,讓玩家進入心流狀態)。
所以說,遊戲數值設計者在大多數遊戲裡做的概率設計是偽隨機。
比如20%的暴擊率,理論上講每一次攻擊觸發暴擊都是固定的機率20%,每一次攻擊的暴擊率是獨立且固定的,並不受攻擊次數和之前攻擊效果的影響。
但由於玩家存在另一種理解,他們期待5次攻擊必定出現1次暴擊,更寬泛的一點說,玩家會認為在3~7(一般4~6為佳)次的過程中必定會發生一次暴擊。對於數值設計者而言,並不希望玩家能夠在20%的暴擊率下,獲得較高概率的連續兩次暴擊,同時也不希望出現連續10次不發生暴擊的情況。這種問題在傳統固定概率的情況下較難得到解決。
對於固定的概率,定義P(K)為前K-1次未發生暴擊,第K次發生暴擊的概率,則P(K=N)為:
這是一個單調遞減函式,隨著N的不斷擴大,P不斷減小,在有限次操作的狀態下,玩家對於20%容易缺少一個較為準確的感知。為了增強這種感知,可以讓P在K=5附近擁有較大的概率,在其他情況下擁有較小的概率。
從第5次開始有意讓玩家加強概率感知
下圖更直觀的展示了這種差別。
那麼偽隨機具體怎麼設計呢?涉及到利益相關內容,僅搬運網上關於dota劍聖暴擊率偽隨機分析的文章作為案例。
設定初始的概率為P,定義隨機種子C為一個常數。對於劍聖暴擊率,設P=20%,C=5.57%。
1. 進行第一次攻擊,暴擊概率為C。如果未暴擊,進入流程2;如果暴擊,返回流程1進行下次暴擊計算。
2. 進行第二次攻擊,暴擊率為2C。如果未暴擊,進入流程3;如果暴擊,返回流程1進行下次暴擊計算。
3.進行第三次攻擊,暴擊率為3C。如果未暴擊,進入流程4;如果暴擊,返回流程1進行下次暴擊計算。
......
17. 進行第十七次攻擊,暴擊率為17C。如果未暴擊,進入流程18;如果暴擊,返回流程1進行下次暴擊計算。
18. 本次攻擊必暴擊。返回1進行下次暴擊計算。
也就是說,如果一個英雄始終不暴擊,那麼他的暴擊概率將會是:C,2C,3C,4C,...,NC。
當N足夠大時,NC會大於等於1,所以一定會發生暴擊。實際上,英雄攻擊的暴擊概率始終在若干個不同暴率的狀態中切換。
但是,當這種攻擊進行次數很多以後,此英雄的平均暴擊概率會趨近於20%
下面的表格是從網上搜尋到的WAR3關於遊戲顯示概率P、隨機種子C、暴擊前攻擊的最大次數maxN,實際統計概率Pcount的資料。
在實際使用過程中,我們關注如何通過P值求得C值。P和C的函式關係為單調函式,可使用最小二分法:
首先定義一些引數,C1,C2,C3,eps,初始化C1=0,C2=1,暴擊率精度eps=0.01%,預設暴擊率為Ps。
1.令C3=(C1+C2)/2
2.計算C3的實際Pa。如果Pa與Ps差值的絕對值小於eps,則結束計算,C3即為所需要的種子;如果Pa與Ps差值大於eps,進入流程3。
3.如果Pa<Ps,則C1=C3;如果Pa>Ps,則C2=C3。返回流程1。
通過有限次的迭代,我們就可以獲得隨機種子C。
通過以上的偽隨機機制,有利於遊戲中概率事件的穩定。對於暴擊事件來說,偽隨機機制降低了連續暴擊或者連續不暴擊的的概率,這些都是玩家想要的。
題外話:
在現代手機遊戲中的gacha設計裡,例如常見的十連抽,這種過程也是偽隨機過程的一種。這種十連抽必中的策略,保證了玩家擁有較為平穩的體驗,也有利於遊戲體驗節奏的把控。
作者:Sithferia
相關文章
- 50%暴擊等於4下必暴 遊戲中的偽隨機你知道多少?遊戲隨機
- Python隨機數與隨機字串詳解Python隨機字串
- 偽隨機數是什麼?偽隨機數生成方法有哪些?隨機
- C語言中的例子--偽隨機數C語言隨機
- matlab中的偽隨機數原理Matlab隨機
- 數值策劃如何玩轉Dijkstra演算法來設計隨機地圖演算法隨機地圖
- css對於小數尺寸值的解讀簡單介紹CSS
- Matlab 隨機生成兩個數值之間的隨機數Matlab隨機
- [隨機數詳解]生成一個隨機數,生成指定範圍的隨機數及隨機陣列去重隨機陣列
- 關於matlab生成隨機數Matlab隨機
- 偽隨機數 pseudo random number隨機random
- 關於HTTPS的七個誤解HTTP
- 預設的 rand.Intn () 生成的是偽隨機數隨機
- 一道關於隨機數生成的題目隨機
- 切比雪夫不等式(揭示了隨機變數值與數學期望的關係)隨機變數
- 關於大資料的常見誤解大資料
- CSS偽元素詳解以及偽元素與偽類的區別CSS
- 深入解讀ESB與SOA的關係
- 解讀 Flutter 全平臺開發的誤解與偏見Flutter
- 關於變數與‘=’賦值的情況出錯變數賦值
- 網易策劃分享:從社交的角度瞭解遊戲遊戲
- 遊戲策劃是如何用數值來影響玩家體驗的?遊戲
- 偽隨機數C語言程式設計隨機C語言程式設計
- 關於Linux的幾個小誤解(轉)Linux
- NumPy 陣列排序、過濾與隨機數生成詳解陣列排序隨機
- 遊戲策劃設計中關於遊戲節奏的控制(轉)遊戲
- 關於值傳遞和引用傳遞的解釋
- 關於js執行緒問題的解讀JS執行緒
- 關於Flutter iOS安裝包大小的解讀FlutteriOS
- 關於原型和原型鏈的精闢解讀原型
- 硬核 - Java 隨機數相關 API 的演進與思考(上)Java隨機API
- 機器學習之決策樹與隨機森林模型機器學習隨機森林模型
- 一文讀懂隨機森林的解釋和實現隨機森林
- 關於oracle的相關檔案及目錄的解讀(原)Oracle
- #解決opencv與matlab對於BMP格式讀出的畫素值不同的問題OpenCVMatlab
- @Import與@ImportResource註解的解讀Import
- 變數的解構賦值變數賦值
- 關於Mapreduce Text型別賦值的錯誤型別賦值