3 个版本
0.1.2 | 2022年10月3日 |
---|---|
0.1.1 | 2022年10月3日 |
0.1.0 | 2022年10月3日 |
1827 在 算法
17KB
210 行
天鳳牌墙洗牌算法
天鳳 是一个在线 日本立直麻将 游戏。截至 2022-10-02,天鳳发布了 牌墙洗牌算法,以及 特定游戏种子的验证数据,包括中间结果。
此 Crate 重新实现了从 RNG 种子重建任何游戏完整洗牌牌墙的发布算法。
此 Crate 是 no_std
。
MT19937 RNG
此 Crate 包含了从 MT19937
复制的实现,来自 https://crates.io/crates/mt19937。这主要是为了 no_std
兼容性。
- 种子:
[u32; 624]
。 - 原始输出类型:
u32
。
算法
假设 u32
在字节缓冲区中是little-endian(LSByte 首先)。
每局游戏开始时,通过种子为游戏初始化一个 MT19937 RNG。此种子可以作为一个种子数组的 base-64 编码来检索。
每轮游戏需要一个洗牌。我们首先按以下方式生成随机性
-
从游戏范围的 RNG 中生成 9 块 1024 位(
[u32; 288]
)的随机数。此数组在 原始算法描述中名为src
。 这作为src_from_mt
实现。 -
对于每个1024位的块(
[u32; 32]
,小端),计算其SHA512哈希。所有9个512位的块连接成[u32; 144]
。这个数组在原始算法描述中命名为rnd
。这是一个实现为rnd_from_src
的过程。
然后,我们使用rnd
来洗牌墙。
- 从墙 = 所有牌的排序数组开始;长度 = 136(4名玩家)或108(3名玩家)。
- 执行一个从低到高的Fisher-Yates Shuffle,使用
rnd[i]
作为随机数表,缩放到i..n
作为i + rnd[i] % (n - i)
。这是一个实现为shuffle_with_rnd
的过程。 - 洗好的墙数组应该从最高索引到最低索引发牌。
依赖项
~675KB
~14K SLoC