3 个版本

0.1.2 2022年10月3日
0.1.1 2022年10月3日
0.1.0 2022年10月3日

1827算法

MIT 许可证

17KB
210

天鳳牌墙洗牌算法

Crates.io docs.rs

天鳳 是一个在线 日本立直麻将 游戏。截至 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