洗牌偏差对比

用同一套设置对比朴素洗牌和 Fisher–Yates 的偏差。

全程在浏览器本地运行。输入和结果不会上传。复制 URL 默认只包含设置。

其他语言 ja | en | zh-CN | es | pt-BR | id | fr | hi-IN | ar

使用方法(3 步)

  1. 选择列表模式(按大小 / 自定义)并设置模拟次数。
  2. 点击 对比,用同样设置跑两种洗牌。
  3. 查看热力图和统计,然后复制仅设置的 URL 或下载报告。

看清洗牌偏差

洗牌偏差对比工具

朴素交换每一步都在全范围取随机索引;Fisher–Yates 每一步缩小范围,在随机整数均匀时能得到均匀排列。

这是 JavaScript 中常见的反模式。结果依赖引擎,通常有偏差。

概览

提示:这里的 χ² 和 df 是直观用的近似(因为存在约束,并不严格)。不要把它当作正式证明。

图表

图例:naive=红、FY=绿、sort=紫(开启时)。

曲线是 df = n² - 1(近似)的 χ² 密度。竖线表示观测到的 χ²。

此图按 |i - j|(与对角线的距离)汇总。大于 1 表示“太靠近原位置”。

结果

每一侧都显示位置矩阵(项目 i → 位置 j)的统计结果。

朴素洗牌

Fisher–Yates

常见问题

Fisher–Yates 一定没有偏差吗?
如果 randomInt 是均匀的,就没有算法偏差。把随机字节映射到整数范围时要避免取模偏差。
为什么不推荐 sort(() => random - 0.5)?
它有偏差且依赖 JS 引擎。你可以在本页勾选它,看看你的浏览器会出现什么结果。
通过这个就代表加密安全?
不。此工具展示的是洗牌算法的偏差。安全性取决于你的 RNG 和威胁模型。
模拟次数用多少合适?
先从 100k 开始。n ≤ 8 时,打开排列频率跟踪更容易直接看出偏差。

相关工具

相关计算器