使い方(3ステップ)
- リスト指定(サイズ/カスタム)と試行回数を決めます。
- 比較する を押して、2手法を同条件で実行します。
- ヒートマップと統計を確認し、設定URLのコピーやレポート保存を行います。
偏りを見える化
シャッフル偏り比較ツール
ナイーブswapは毎回「全範囲」から入れ替え先を選ぶため、一様な順列になりません。Fisher–Yates は範囲を縮めて選ぶため、一様(randomInt が一様なら)になります。
重複はOKです。解析は行番号(1..n)を識別子として扱います。
JavaScriptでよくあるアンチパターンです。結果はエンジン依存で、偏りが出ます。
サマリー
補足:ここでの χ² と df は直感用の目安です(制約があるため厳密ではありません)。
チャート
凡例:naive=赤、FY=緑、sort=紫(ON時)。
曲線は df = n² - 1(目安)の χ² 密度です。縦線が観測された χ² を示します。
|i - j|(対角線からの距離)ごとに集計したチャートです。1より大きいほど「元の位置に近すぎる」傾向があります。
結果
各手法について、アイテム i が位置 j に来た回数(行列)を集計して表示します。
ナイーブシャッフル
Fisher–Yates
sort(() => random - 0.5)
よくある質問
Fisher–Yates は常に偏りがありませんか?
randomInt が一様なら偏りはありません。乱数から範囲整数に変換する際は、modulo bias を避けてください。
sort(() => random - 0.5) はなぜダメ?
偏りがあり、エンジン依存です。このページでは任意で追加して、あなたのブラウザでの挙動を確認できます。
これに合格すれば暗号的に安全?
いいえ。ここで扱うのはアルゴリズム上の偏りです。安全性は RNG と脅威モデルに依存します。
試行回数はどれくらいが目安?
まずは 100k がおすすめです。n ≤ 8 なら順列頻度を ON にすると、偏りがより直感的に見えます。