作者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/cn.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