洗牌偏差對比

用同一套設定對比朴素洗牌和 Fisher–Yates 的偏差。

全程在瀏覽器本地執行。輸入和結果不會上传。複製 URL 預設只包含設定。

其他語言 日本語 | English | 简体中文 | 繁體中文 | Español | Português (Brasil) | Bahasa Indonesia | Français | हिन्दी | العربية

使用方法(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 時,開啟排列頻率跟蹤更容易直接看出偏差。

相關工具

相關計算器