🎲 窝要烟牌
确定性随机烟牌验证 — 同一个 seed,任何人都能跑出完全相同的结果
怎么用
- 管理员和选手提前约定一个随机种子(比如"安德罗妮4月29日14:00第一句话")
- 管理员用种子在后台执行烟牌,分配分组
- 任何人在这里输入同样的种子 + 同样的选手列表,验证结果是否一致
在线验证
烟牌结果
Seed hash:
算法代码(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()