論衝裝之:強化機率率到底可不可信?(含數值模擬結果)

相信很多人在強化裝備時,總是滿心期待能夠上20、25、27、甚至MAX

這個遊戲用到非常多的機率運算,說他是一個機率遊戲也不為過

但是機率這個東西究竟能不能精準計算?能不能有一個統計值?

這個答案要看你從什麼角度下去回答

舉個例子,我們都知道擲一枚銅板正面跟反面的機率是1/2(其實不一定對,硬幣兩面印花不同,重量就不同,因此不是完美的1:1)

換個更容易懂的說法,也就是如果有10000個人同時丟一枚銅板

那麼正面跟反面差不多會有5000人:5000人

丟銅板的次數如果趨近於無限次,那就會得到1:1的結果

但是,有10000個人丟銅板,有沒有可能全部都是正面,或是全部都是反面?

答案是機率不等於零,也就是有此可能

所以你說要精準計算出1:1的結果可行,但是10000個人同時丟出正面機率也不等於零

----------------------------------------------------------------------------------------------------------

舉個例子,+19衝到+20的機率是35%,這個敘述句可以換個問法

如果要把+19的武器衝到+20,然後要有35%的機率,那麼需要強化幾次?要有多少張白捲?

這個問題的答案很簡單,你只要打開鐵匠鋪強化就知道了

就是強化一次,需要4張白捲

----------------------------------------------------------------------------------------------------------

問上面這個問題是想因我想引出接下來討論

常常看到版上有些人PO出+17不上防爆連用白捲過衝上+20

這個機率也很簡單計算,既然是連過的話

那就是 p = 0.4 x 0.35 x 0.35 x 100% = 4.9%

也就是100個人有+17的武器,官方送12張白卷,平均只有4.9個人可以點上+20

----------------------------------------------------------------------------------------------------------

好了,由上面的討論,我們可以簡單地知道,非洲人口是一定大於歐洲人口的

這個其實就是官方所說的,重點是強化次數

如果明天遊戲改版,上線獎勵是100萬張白捲,而且衝裝不用錢

那麼只要"次數夠多"就一定會有"非常高的機率"可以讓你有"某一次"當歐皇連過從+0衝到+30

注意這邊,非常高的機率並不是100%,頂多99.99999999999999%

但是有沒有可能一百萬張卷全部都失敗,前面我們討論過了,機率非常低,但"不等於零"

----------------------------------------------------------------------------------------------------------

相信到這邊大家已經了解我想表達什麼了

同上面的討論,問題應該是,我+19衝到+20、上馬夫,只衝一次過的機率是35%的話

反過來看就會有65%的機率失敗,但因為上了馬夫,所以卷軸的數量只要夠,就一定可以點上+20

有4張白捲、強化1次過的機率是35%

有8張白捲、強化2次過的機率是50%(機率為假設)

有12張白捲、強化3次過的機率是75%(機率為假設)

依此類推...

那麼我如果要把機率提升到90%過,那麼需要多少張白捲?

這個問題是高中數學,需要計算 log 函數,但這邊就不進行這種枯燥的數學計算

因為高中的這個題型機率是固定的,而遊戲中+0~+30的機率是不一樣的

再者,我們還需要統計強化張數、馬夫使用量、金幣等等其他數據

因此用手算起來會非常的複雜

----------------------------------------------------------------------------------------------------------

因此我們仰賴另一種方式,就是電腦數值運算

這邊先簡單介紹一下程式碼,如果不想看可以直接跳到下面看結論

一.先把常用的參數拉到程式最上邊,方便不同情形下的修改

衝裝有四種:白捲不上馬夫、白捲上馬夫、祝卷裸衝以及祝卷上馬夫,這邊其實就是透過0跟1來當開關,分別跑不同的 Supoutine(副程式),以達到我們要的模擬效果

二.如果有人要問我電腦配備的話,CPU是5820K,顯卡是GTX 970

不過由於我本身電腦還我再跑其他模擬及數值運算,因此此次的模式是由單晶片系統來運行,

透過 USB I/O port 來接收結果,只要程式碼對,結論都一樣就是了

三.主程式這邊如同第一點說將不同的參數呼叫對應的第1個副程式執行之

至於為什麼要這麼做原因很簡單,白捲+1、祝卷+3,同時還有上不上馬夫的問題,上了馬夫失敗不會減少強化等級,而不上馬夫則會,共有四種情形。這邊還有用到 C 語言當中的指標運算,簡單介紹一下指標就是把變數的記憶體位址丟給副程式,但是副程式運算之後變數不會改變,所以還要用到另一種演算法叫做 Call by value、Call by address、Call by value resule...之前考高考的時候念的,有點忘記正確是哪一個了,如果有資工的歡迎指導

四.經過上一步的參數分析後就看我們是用白捲還是祝卷有沒有上馬夫再呼叫第2個衝裝副程式總共有四種這邊只介紹一種就是祝卷+馬夫

這邊一樣是用指標運算,把指標丟來丟去得到我們要的結果,但如同我文章開頭說的,隨著+0衝到+30,衝裝的機率、卷軸數量、馬夫、金幣都是不同的,因此這個副程式在衝裝迴圈當中會一直重複呼叫 chance 函數,也就是抓取 chance 函數當中往下一級強化的機率(p)、卷軸數量(num)、馬夫(horse)、金幣(cost)值,然後看衝幾次就把結果累加起來,最後達到我們要的衝裝值時,就可以看總共衝了幾次裝、花了多少卷軸、馬夫用幾顆、金幣花了多少

五.這邊為上述 chance 函數不同強化等級要往下一個等級衝所需要的參數值, 從+0~+30總共有31筆資料

至於你說為什麼不直接用網頁上的衝裝模擬器來點? 因為網頁上的衝裝模擬器還有動畫,如果需要衝10000次你不就點一個禮拜不能休息..這邊最後再標註一下,函式中 s 代表目前強化等級,p、num、horse、cost 則代表要往下個強化等級衝之成成功機率、馬夫數量、花費金幣

六.這邊可以不看了這邊只是單晶片系統跟PC間的溝通直接呼叫函式即可

我再撰寫這個程式的時候,為了可以即時看到目前的強化值,所以有設計了即時 USB I/O 通訊的功能,但是開啟即時衝裝回報的話,整體來說就會跑得非常慢,雖然 CPU 算很快,但是 I/O 傳輸速度卻比不上 CPU 運算速度,就會變成 I/O bounded job,整體受限於 I/O 傳輸效能(這部分比較屬於計算機概論了,想知道可以 Google:范紐曼瓶頸),因此我再跑的時候是關 I/O 回報的

到這邊為止,我們的自動衝裝模擬器已經建構完畢,剩下就是開始跑數值模擬了!

----------------------------------------------------------------------------------------------------------

開始模擬如果你跳過講解程式的部分請直接從這邊往下看

我的程式整體架構是這樣的:

1.設定一個衝裝初始值and衝裝最後值

2.設定是白捲還是祝卷

3.設定上不上馬夫

在卷軸、防爆、金幣無限的情況下,衝到大於或等於我們要的值才停止,並且回報衝了幾次裝(i)、花了幾張卷軸(num)、用了幾顆馬夫(horse)、以及花多少金幣(cost),在遊戲中很難取的祝卷跟馬石,對電腦來說也只是一個無號整數變數所儲存的一個值、也就是0跟1的訊號、也就是記憶體中高電位跟低電位、也就是電腦公司所租伺服器磁碟的高磁場跟低磁場,因此我們要多少資源就有多少資源!

前面有說過,由於機率越多次才可以趨近理論結果,但礙於篇幅這邊先取簡單模擬5次所得的平均

a1.一開始來個簡單的如果要從+0~+10且使用白捲裸衝需要的參數如下

這個階段最簡單,各位可以去用網站上的衝裝模擬器來點,看數據是否接近,亦或是課長已經MAX、手邊還有多餘500張白卷,可以幫大家在遊戲中驗證

a2.再來同樣是+0~+10這次換成【祝卷裸衝資料如下

到這邊我們可以發現,只要換成祝卷,雖然沒上馬夫,但+0~+2成功率為100%,必跳+1~+3,故強化次數下降非常多,但是花費台幣卻大幅上升了XD

a3.+0~+10白捲+馬夫

跟白捲裸衝相比,由於上了馬夫失敗不會下降的關係, 平均衝裝次數由40.4次降到13.6次, 但還是比不上祝卷裸衝10.2次!

a4.+0~+10祝卷+馬夫

由於祝卷會跳+1~+3,加上上馬夫不會-1,因此衝裝次數最少,這個模擬結果跟我們認知相同!

(做模擬時需要觀察結果值,如果用祝卷防爆,衝裝次數會大於白捲裸衝,就表示程式有 Bug 需要維修)

----------------------------------------------------------------------------------------------------------

接下來是+10衝+20的結果,這個區間應該卡最多人,上+20是一的大門檻

b1.+10~+20白捲裸衝

到這邊你幾乎可以發現白捲裸衝要上+20幾乎是不可能的了....卷軸都要千張為單位,就算你是長期壓等卷軸給你5000張好了,你也沒那麼多金幣可以衝,不過這邊其實也可以看出歐洲人跟非洲人的差別,運氣最好的是強化411次,最差強化到2000次,像我前面說的,其實模擬越多組的平均會越準,好比說10000次模擬結果平均值,由於寫這個 code 已經花了我空閒時間3天了

,更大的數據就要在主程式外圍加一個迴圈,讓他跑10000次自行平均統計,其強化值x衝到強化值y所需的衝裝資源,應該會呈現一個高斯分布,高斯分布山頂所對應的資料值,就是整個遊戲的平均值

b2.+10~+20祝卷裸衝

我相信這邊還是有大課長可以達成的!

b3.+10~+20白捲+馬夫

雖然努力龜馬夫可以達成,但是不如把馬夫放到+23以後衝+30 CP 值更高!

b4.+10~+20祝卷+馬夫

我想不會有人+10就用祝卷,+11~+12上馬夫,那結果很簡單,數據就是介於圖b1~b4四種數據之間。很意外地,居然有一個4次的,大概就是+2+2+3+3吧...也就是常在巴哈發文的超級歐洲人

----------------------------------------------------------------------------------------------------------

c1.+20~+30白捲裸衝

+20衝+30當然沒有人會用白捲裸衝,這只是單純看看數據,光是強化次數就要20000多次了,現在各伺服器第一名的大課長強化次數也還沒超過10000吧...而且金幣須要10億!大概玩到遊戲倒了也沒辦法

c2.+20~+30祝卷裸衝

這部分我相信還是有大課長可以完成的,注意最後等級31或32是只28或是29時點祝卷跳+2或+3,在遊戲中會直接顯示MAX

c3.+20~+30白捲+馬夫

這邊也是提供個數據給大家看看,用這種衝法花費的馬夫數量實在驚人,何況這只是衝一件裝呢!

c4.+20~+30祝卷+馬夫

一般通常衝到+23或是+24甚至是+25開始上馬夫,所需資源會介於圖c1~c4之間,當然這個要跑模擬也行,只是就要再改 code 另設條件讓他跑了

----------------------------------------------------------------------------------------------------------

題外話,小弟武器從+17爆回+10後,歷經千辛萬苦終於又點回+17

也終於在兩個禮拜前靠著三次白捲+馬夫 p = 0.4 x 0.35 x 0.35 x 100% = 4.9% 的機率當一次歐洲人了...

但是+20後才發現根本無法脫離+20/+21地獄,而且衝一次就要6萬6,一下子就當乞丐了...

上20後有人建議+24或是+25再用祝武+馬石

不過小弟是建議+23就開始用祝武馬伕了

這邊有跑了一點數據分析

d1.【+20~+23】【白捲裸衝】

d2.【+20~+24】【白捲裸衝】

可以發現裸衝+23跟+24平均所花費的金額差非常多,當然你如果是大課長,或是像+24第五組模擬一樣,只要6次就可以上,那就沒什麼差別了。但如果是一般玩家的話,這幾百萬可以做很多事情呢,何況你如果是非洲玩家,像+24第四組一樣,需要花到867萬才能點上+24呢...強化多+1戰鬥力就多個幾千,但是省下500萬可以讓你合很多裝去超越,我相信這樣平均戰鬥力才會比較高吧!

----------------------------------------------------------------------------------------------------------

到這邊全部重要的數據都PO上來了,當然我相信只跑5次平均還是有點太少的,之後要更大數據的部分就我有時間再寫了...最後,這邊必須要註明,程式中所使用的機率,是1~100出現的機率各是1%,如果遊戲中的衝裝演算法不是這麼寫的話,那就沒人可以知道了,好比說在某個條件下呼叫一個特殊副程式之類的...程式經過 Compiler(編譯) 後,成為 Object code,這中間有經過:語彙分析→語法分析→語意分析→最佳化→生成目的碼等動作,這是一個

不可逆的動作,因此如要知道官方的演算法是不是"特別"演算法,只能從內部開發人員那邊拿到程式原始碼,或是請高手去分析網路封包,像當時二戰在破解迷密碼機一樣了吧!

數據+0~+10的部份各位可以到網站上的衝裝模擬器驗證,如果發現我的數據偏差太大可以告知我,而從+10~+30的數據雖說只有5組平均,但是也有其參考的價值,因為衝裝的次數夠多,電腦所產生的隨機變數夠平均,所以不難從+0~+10、+10~+20、+20~+30這三個區間看出,每個區間所耗的資源都是不同層級。萬組以上的大數據模擬,看能不能在下次改版前完成(希望),希望大家都能夠衝裝順利

最後的最後,本人是從事電子電路產業的,並非資工或資訊本科系的,寫程式是我的興趣,僅以此興趣與各位大大分享,如有錯誤,或是觀念不正確,也歡迎大家多多指教,感謝!

參考來源

喜歡這篇文章嗎?立刻分享出去讓更多人知道~