![]()
163場對局,136個英雄,同一個英雄連續roll出5-6次——這位程序員決定用代碼拆穿手游的"隨機"謊言。
事情始于《英雄聯盟手游》的ARAM模式。5v5隨機英雄,不滿意可以擲骰子重roll,骰子攢起來很慢,玩家用得摳摳搜搜。作者本來只是陪朋友入坑,結果越玩越不對勁:想要的英雄永遠roll不到,買了皮膚的英雄更是像被系統拉黑。
免費游戲的套路他懂。留存率、日活、付費轉化,這些指標背后藏著一堆"灰色心理學"。但當同一天內連續10-12局反復roll到同一個英雄時,他坐不住了——這已經不是運氣差能解釋的了。
163場數據的笨辦法
沒有抓包,沒有逆向,就是最原始的笨功夫。每局開場截圖記名字,Excel硬記163場,覆蓋當時全英雄池136個角色。Wildcard機制(五選一特殊骰子)因為太難追蹤,直接棄用,保證數據干凈。
樣本量夠不夠?統計學上136個選項、163次抽取,確實能說明一些問題。但真正的難題是:怎么定義"公平"?
作者用Go寫了一個模擬器,按他理解的"良心做法"實現——密碼學級隨機數,每個英雄權重均等,純純的真隨機。然后拿這個理想模型,對比自己的實際遭遇。
真隨機會產生聚類,這是數學常識。藍噪聲(Blue Noise)刻意打散分布,看起來均勻;真隨機反而會出現" streak"——連續幾次抽到同一個,就像拋硬幣連出五把正面。問題只在于:你的"隨機"是真隨機,還是假裝隨機的假把式?
圖表里的貓膩
go-echarts生成的可視化一拉出來,味道就不對了。某些英雄的出場頻率明顯偏離理論值,而且偏的方向很"懂事"——作者熟練度低的、沒皮膚的,反復橫跳;買了限定皮的、苦練過的,仿佛被設置了冷卻時間。
他特意檢查了時間維度上的分布。真隨機的聚類應該是散點式的、無規律的;但他的數據呈現出某種...節奏感。某些英雄在特定時段密集出現,又突然消失,像是有個調度表在背后。
這讓人想起手游行業的公開秘密:動態難度調整(Dynamic Difficulty Adjustment)早已不是新聞。從《糖果傳奇》到《FIFA Ultimate Team》,系統根據玩家狀態實時調節"運氣",讓你輸到想氪、贏到想肝,就是不會讓你爽到想下線。
ARAM的隨機池理論上對所有玩家一視同仁,但"隨機"的定義權在開發商手里。權重可以調,偽隨機算法可以埋,甚至你的歷史行為數據——勝率、皮膚擁有率、在線時長——都可以喂進模型,輸出一個"剛好讓你不舒服"的結果。
代碼不會撒謊,但算法會
作者把Go代碼和完整數據集開源了。這不是什么驚天大瓜,沒有起訴、沒有官方回應,就是一個玩家用程序員的方式求證一個直覺。但163場的樣本戳破了一層窗戶紙:當你覺得"今天運氣真差"時,可能有個推薦系統在默默工作。
免費游戲的商業模式決定了,"公平"從來不是最優解。最優解是那個讓你既不退坑、又愿意掏錢的微妙平衡點。隨機系統是這個平衡器的核心組件,它負責制造渴望(roll不到想要的)、制造驚喜(偶爾讓你爽一把)、制造焦慮(骰子用完了好慌)。
作者最后說,他沒打算繼續追蹤了。163場足夠說明問題,再多也只是重復驗證。而且說到底,知道真相之后,游戲還玩得下去嗎?
這個問題,他留給了每一個曾在深夜罵過"這隨機有毒"的玩家。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.