🎲 窝要烟牌

确定性随机烟牌验证 — 同一个 seed,任何人都能跑出完全相同的结果

怎么用

  1. 管理员和选手提前约定一个随机种子(比如"安德罗妮4月29日14:00第一句话")
  2. 管理员用种子在后台执行烟牌,分配分组
  3. 任何人在这里输入同样的种子 + 同样的选手列表,验证结果是否一致

在线验证

算法代码(Python,可独立运行)

import hashlib
import struct
import sys

def shuffle(players: list[str], seed: str) -> list[str]:
    """确定性随机洗牌 — SHA256 + Fisher-Yates

    同一个 seed + 同一个选手列表 → 完全相同的结果
    与服务端 /api/tournament/shuffle 结果一致
    """
    # SHA256(seed) → 32 字节 → 8 个 uint32 → 求和作为初始种子
    h = hashlib.sha256(seed.encode("utf-8")).digest()
    seed_int = sum(struct.unpack_from("> 17)
        x ^= (x << 5) & 0xFFFFFFFF
        state = x & 0xFFFFFFFF
        return x % max_val

    # Fisher-Yates shuffle
    arr = list(players)
    for i in range(len(arr) - 1, 0, -1):
        j = rng(i + 1)
        arr[i], arr[j] = arr[j], arr[i]
    return arr

# ── 示例 ──
if __name__ == "__main__":
    seed = "安德罗妮4月29日14:00第一句话"
    players = [
        "衣锦夜行#1000", "瓦莉拉#2000", "南怀北瑾#3000",
        "安德罗妮#4000", "王师傅#5000", "萌太奇#6000",
        "啦神#7000", "戴佳伟#8000", "囚徒#9000",
        "冰蓝飞狐#1001", "锦衣夜行#2001", "Sol君#3001",
        "春哥#4001", "不二#5001", "狗贼#6001", "瓦莉拉的跟班#7001",
    ]
    result = shuffle(players, seed)
    # 按每组 8 人分组
    group_size = 8
    for i in range(0, len(result), group_size):
        group = result[i:i+group_size]
        print(f"组 {i // group_size + 1}:")
        for j, p in enumerate(group):
            print(f"  {j+1}. {p}")
        print()
⬇ 下载 .py