作者dube116 (ろあちゃん的ATM)
看板KanColle
標題[閒聊] 出手順序的計算
時間Mon Jul 27 17:37:50 2026
同射程的艦娘之間先出手的機率不相等
這件事情應該早有共識
https://reurl.cc/DYZV2O
2024的這份驗證就已經有歸納出一些情況
但沒有提出計算方式
今天按模擬器的時候又被警告說這個射程組合的傾向不明
就抓了上面那個驗證的原始資料下來分析看看
跟AI討論了一下發現結論可能意外的簡單
先說結論
田中很可能只是用了 php 內建的 quick sort
什麼是快速排序可以看下面維基百科借來的圖 反正就是一種排序的演算法
選一個基準點然後小的放前面 大的放後面 分治循環到排序完成
https://i.meee.com.tw/iI6huA0.gif
從全艦同射程的原始資料會發現
位於中間的那一個 行為跟其他幾隻特別不同(如六船編成的三號位)
先開火的機率特別低
從這點推測很可能是使用快速排序 且使用中點作為基準點
再來就是AI直接猜艦娘的後端是用php撰寫(後來也有找到其他人這樣推測)
然後從數據分布呈現二進位 推測在同射程時回傳的是公平的隨機1/2
所以復刻了php 5的內建排序 然後跟原始資料去對比
發現數據高度吻合
不過統計學的東西我根本忘得差不多了 AI自己算的
對於樣本足夠的組合 卡方值/自由度大致上都在1左右
然後推估的原始代碼八成就長這種感覺
usort($ships, function ($a, $b) {
if ($a->range != $b->range) return $b->range - $a->range;
return mt_rand(0, 1);
});
搞不好寫這段程式的人還以為這樣就是同射程誰在前面的機率都是1/2(
後來也發現有人2018年就猜到快速排序 但有些細節不對所以數字不完全能對上
https://x.com/Xe_UCH/status/1051323134106882048
https://dube116.github.io/kancolle-shelling-order/
隨便叫AI搞了一個模擬器 但我應該是不會再幫它加功能 看看就好
可以期待其他工具什麼時候把這加進去比較適合
https://i.meee.com.tw/y3RcaqE.png
比如大武最差的情況 旗艦被搶先手的機率可能高達75%
全隊至少三種射程 且3號位為唯一最短
https://i.meee.com.tw/LB9Afrt.png
最好的情況是50%
全隊至少三種射程 且3號位非全隊最短時可達成
麻煩的是這個算法很難歸納出什麼簡單易懂的規則
https://reurl.cc/rk1mgb
參考的計算結果
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.133.8.139 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/KanColle/M.1785145075.A.999.html
1F:推 daoyousan: 欸?假設敵我全隊都一樣射程07/27 17:44
2F:→ daoyousan: 不是由我們先攻嗎?07/27 17:44
3F:→ dube116: 這是在說我方同射程的先後順序07/27 17:46
4F:→ dube116: 像你的大和武藏誰先動07/27 17:46
5F:推 yumekaze: 這個 居然連算法都可以逆推出來的嗎07/27 17:48
6F:→ dube116: 因為蒐集的數據量很大 而且數據夠有特色吧07/27 17:49
7F:→ yumekaze: 強07/27 17:50
8F:推 yellowhow: 好強,難怪我武藏都先動!07/27 17:50
9F:推 Sousake: ・ω・ 強07/27 18:08
10F:推 StellaNe: 如果特定狀況高達75%的話 應該很容易驗證吧07/27 18:08
※ 編輯: dube116 (39.12.216.185 臺灣), 07/27/2026 18:17:34
11F:→ dube116: 裸數據裡AACBBB這個組合的比例確實是24%:76% 07/27 18:17
12F:推 StellaNe: 艦戰架算是不參加嗎? 07/27 18:35
13F:→ dube116: 對 不參加 看引用的那篇的結論 07/27 18:39
14F:推 StellaNe: 那AABB 兩個不參加 就是一號先手75%了 07/27 18:58
15F:→ StellaNe: 4BB2CVL 或 2BB2CV2CVL CVL都是艦戰架的狀況 07/27 18:58
16F:→ dube116: 對 這樣二號會落到中間點 07/27 19:06
17F:推 yuricon: 好神喔 07/27 19:18
18F:推 darkray: 太神了,大武以後記得第三位不能唯一最短 07/27 19:27
19F:推 vvrr: 一直不太懂為什麼會用到排序,跑去看了連結那個2018年的文章 07/27 19:55
20F:→ vvrr: 裡面提到的其實是「洗牌」的一種方法 07/27 19:56
21F:→ dube116: 語意上不難理解吧 這裡決定手順的方式就是對射程做排序 07/27 19:57
※ 編輯: dube116 (220.133.8.139 臺灣), 07/27/2026 19:58:41
22F:→ dube116: 同射程會有這麼複雜的情況 只是這個排序造成的副作用 07/27 19:59
23F:→ dube116: 我是不覺得這個分布是田中刻意產生的行為 07/27 19:59
24F:→ dube116: 八成就是碼農呼叫了一個內建的排序 但沒想過會發生什麼事 07/27 20:01
25F:推 vvrr: 這裡想做的事有兩件:1.按射程出手排序 2.避免射程相同時 相 07/27 20:19
26F:推 vvrr: 對位置永遠不變. 第2點做的事是shuffle 07/27 20:28
27F:推 EternalK: 排序我可以理解,但是相同的輸入要產生不盡相同的輸出 07/27 20:46
28F:→ EternalK: 我就不理解了w 07/27 20:46
29F:推 vvrr: 就我所知,所有排序法都沒有保證第2點是否成立(排序法遇到同 07/27 20:46
30F:→ vvrr: 大小 不管誰先誰後都算成功) 07/27 20:47
31F:→ vvrr: 如果射程相同時 相對位置也固定 那全體短射程就會照順序打.. 07/27 20:48
32F:→ vvrr: 達不到現在那種感覺(誰先出手不一定) 07/27 20:48
33F:→ dube116: 對 我剛剛也沒講清楚 我指的是這個分布應該不是預期中的 07/27 20:52
34F:→ dube116: 行為 但不固定出手順確實是想要的效果 07/27 20:53
35F:推 aliensky: 原來不是田中手操我的武藏先手 07/28 11:29
36F:推 vvrr: 如果要同時做到上面那2件事,又要滿足"同射程的船機率相同" 07/28 11:54
37F:→ vvrr: 感覺會非常麻煩。方法一(目前方法):直接排序.利用排序比大小 07/28 11:55
38F:→ vvrr: 射程相同的時候給隨機結果.結果一:隨機是隨機了 機率不等 07/28 11:56
39F:→ vvrr: 方法二:先排序.每一組射程相同的船再隨機洗牌. 結果二: 後面 07/28 11:57
40F:→ vvrr: 隨機洗牌可以保證機會均等 但前面排序時同射程的船可能就先 07/28 11:58
41F:→ vvrr: 被弄亂而有偏差(排序演算法同大小不保證誰先誰後) 07/28 11:59
42F:→ vvrr: 突然查到了。排序演算法有分穩定和不穩定 07/28 12:02
44F:→ vvrr: 這樣用方法二(先排後洗) 選擇穩定的排序 就能保證機會均等了 07/28 12:04
45F:推 vvrr: 更快一點的方法是先隨機洗牌 再用穩定排序 07/28 12:29
48F:推 laswish: 居然連原始代碼都反推出來了,太強 07/28 14:35