海贼王h小游戏 原创航海题材网页游戏站

种子与公平 —— 海贼王h小游戏的随机数怎么选

六款游戏里凡是随机的东西,都从一个显示在读数栏里的整数种子生成。记下那个数字,就能复盘同一局。这篇写清这个选择带来什么、不带来什么。

开发笔记 · 关键词:mulberry32、可复现、洗牌算法

为什么要能复盘

种子随机示意图:左边标着种子四十二的方块,箭头指向右边一串固定数字的格子
同一个种子每次都给出同一串数;页面把种子显示出来才有意义。

第一是能讲清。「这一局的浮标在 73.4 米外、逆风 2.1 米/秒」只有在能重现时才是一句有用的话,否则只是一次性的个人体验。种子显示出来之后,同一局可以被说清、被对照、被争论。

第二是能排错。玩的人说「第五关这个关卡好像无解」,有种子就能复现同一副牌、同一串序列;没有种子只能靠猜。开发时这一点比什么都省时间。

第三是心里有数。知道这一局是由一个数字决定的,和知道它由某个看不见的来源决定,是两种不同的感受——前者承认了规则的存在。

用的是哪一个

用的是 mulberry32:32 位状态,每次把状态加一个固定常数,再做几轮整数乘法与移位混合,最后归一化到 0 到 1 之间。它的好处是实现只有五行、不依赖任何库、同一个种子在任何浏览器上给出同一串数。

它的局限要说明白:这是一个小状态的伪随机生成器,周期有限,统计性质够小游戏用,不适合任何与安全相关的用途——不要拿它生成密码、令牌或抽奖结果。需要那类场景时应当用浏览器自带的加密随机接口,而那个接口恰恰不可复现,所以不适合这里。

种子本身取的是当前时间的低位余数,所以每局不同。这一步不需要随机质量,它只需要「不要每次一样」。

洗牌不要自己乱写

信号旗配对要把十二张牌打乱。用的是 Fisher–Yates:从最后一张往前,每次在「它自己到第一张」的范围里选一个位置交换。写错一个边界(比如范围取成整个数组)就会让某些排列出现得更频繁,而这种偏差肉眼看不出来,只能靠知道正确写法来避免。

对照一下常见的错误写法:给每张牌配一个随机数然后排序。它在很多排序实现下并不均匀,而且比 Fisher–Yates 更慢、更难看懂。十二张牌的规模下两者都不卡,但没有理由选错的那一个。

随机之外的公平

可复现不等于公平。更重要的一条是:随机只决定题目,不决定结果。投石弹道的浮标距离和漂移是随机的,但命中判定完全由公式决定,同样的输入一定得到同样的落点;海图航线的关卡是固定的,随机的只有你走哪条路。

六款游戏里没有一处「随机惩罚」或「随机加成」。这意味着成绩可以归因:打得好是因为算对了或记住了,不是因为这一局运气好。

零外部依赖的写法 触控优先的操作设计 难度曲线怎么排 回开发笔记目录