シャッフル偏り比較

ナイーブなシャッフルと Fisher–Yates を同条件で比較します。

処理はブラウザ内だけで完結します(入力と結果はアップロードしません)。URL共有は設定のみです。

他の言語: ja | en | es

使い方(3ステップ)

  1. リスト指定(サイズ/カスタム)と試行回数を決めます。
  2. 比較する を押して、2手法を同条件で実行します。
  3. ヒートマップと統計を確認し、設定URLのコピーやレポート保存を行います。

偏りを見える化

シャッフル偏り比較ツール

ナイーブswapは毎回「全範囲」から入れ替え先を選ぶため、一様な順列になりません。Fisher–Yates は範囲を縮めて選ぶため、一様(randomInt が一様なら)になります。

JavaScriptでよくあるアンチパターンです。結果はエンジン依存で、偏りが出ます。

サマリー

補足:ここでの χ² と df は直感用の目安です(制約があるため厳密ではありません)。

チャート

凡例:naive=赤、FY=緑、sort=紫(ON時)。

曲線は df = n² - 1(目安)の χ² 密度です。縦線が観測された χ² を示します。

|i - j|(対角線からの距離)ごとに集計したチャートです。1より大きいほど「元の位置に近すぎる」傾向があります。

結果

各手法について、アイテム i が位置 j に来た回数(行列)を集計して表示します。

ナイーブシャッフル

Fisher–Yates

よくある質問

Fisher–Yates は常に偏りがありませんか?
randomInt が一様なら偏りはありません。乱数から範囲整数に変換する際は、modulo bias を避けてください。
sort(() => random - 0.5) はなぜダメ?
偏りがあり、エンジン依存です。このページでは任意で追加して、あなたのブラウザでの挙動を確認できます。
これに合格すれば暗号的に安全?
いいえ。ここで扱うのはアルゴリズム上の偏りです。安全性は RNG と脅威モデルに依存します。
試行回数はどれくらいが目安?
まずは 100k がおすすめです。n ≤ 8 なら順列頻度を ON にすると、偏りがより直感的に見えます。

関連ツール

関連電卓