なぜこの単純なシャッフルアルゴリズムを偏向かった。う単純な理由がありますか?

StackOverflow https://stackoverflow.com/questions/859253

  •  21-08-2019
  •  | 
  •  

質問

ここのシャッフルアルゴリズムを偏った結果:

# suppose $arr is filled with 1 to 52

for ($i < 0; $i < 52; $i++) { 
  $j = rand(0, 51);

  # swap the items

  $tmp = $arr[j];
  $arr[j] = $arr[i];
  $arr[i] = $tmp;
}

してみてはいか...の代わりに52,3(仮3カードが使用され、実行しま10,000回の集計の結果、この結果は斜めに向けて一定のパターン...

の質問です---うごく簡単に説明で失業が生まれるのでしょうか。

正しい使う

for ($i < 0; $i < 51; $i++) {  # last card need not swap 
  $j = rand($i, 51);        # don't touch the cards that already "settled"

  # swap the items

  $tmp = $arr[j];
  $arr[j] = $arr[i];
  $arr[i] = $tmp;
}

その質問です---なぜ最初の方法が考えも全くランダムには、結果のバイアスがかかる

更新1: さあここで指摘するとともに、これはrand($i,51)でシャッフルを修正。

役に立ちましたか?

解決

この完全ツリーの確率のためにこれらの代替す

その開発プロジェクトの配列123しい列挙すべての種々の方法をランダムな結果をコードする。

123
 +- 123          - swap 1 and 1 (these are positions,
 |   +- 213      - swap 2 and 1  not numbers)
 |   |   +- 312  - swap 3 and 1
 |   |   +- 231  - swap 3 and 2
 |   |   +- 213  - swap 3 and 3
 |   +- 123      - swap 2 and 2
 |   |   +- 321  - swap 3 and 1
 |   |   +- 132  - swap 3 and 2
 |   |   +- 123  - swap 3 and 3
 |   +- 132      - swap 2 and 3
 |       +- 231  - swap 3 and 1
 |       +- 123  - swap 3 and 2
 |       +- 132  - swap 3 and 3
 +- 213          - swap 1 and 2
 |   +- 123      - swap 2 and 1
 |   |   +- 321  - swap 3 and 1
 |   |   +- 132  - swap 3 and 2
 |   |   +- 123  - swap 3 and 3
 |   +- 213      - swap 2 and 2
 |   |   +- 312  - swap 3 and 1
 |   |   +- 231  - swap 3 and 2
 |   |   +- 213  - swap 3 and 3
 |   +- 231      - swap 2 and 3
 |       +- 132  - swap 3 and 1
 |       +- 213  - swap 3 and 2
 |       +- 231  - swap 3 and 3
 +- 321          - swap 1 and 3
     +- 231      - swap 2 and 1
     |   +- 132  - swap 3 and 1
     |   +- 213  - swap 3 and 2
     |   +- 231  - swap 3 and 3
     +- 321      - swap 2 and 2
     |   +- 123  - swap 3 and 1
     |   +- 312  - swap 3 and 2
     |   +- 321  - swap 3 and 3
     +- 312      - swap 2 and 3
         +- 213  - swap 3 and 1
         +- 321  - swap 3 and 2
         +- 312  - swap 3 and 3

今回の列番号の前にスワップの情報が含まれての最終結果、27きます。

うどそれぞれのパターンが

123 - 4 times
132 - 5 times
213 - 5 times
231 - 5 times
312 - 4 times
321 - 4 times
=============
     27 times total

を実行する場合のコードをスワップにランダムで、無限回数のパターン132,213や231がより多くのパターンの123,312、321るものの、なかなかのコードをスワップにつながりが生じやすくなります。

今はもちろん、このように走らせる場合、コードの30倍(27+3),起きのすべてのパターンの庭の5倍もの時を扱う統計での長期的傾向にあります。

こちらはC#のコードを探求する乱数の発生源のための一つの可能なパターン:

class Program
{
    static void Main(string[] args)
    {
        Dictionary<String, Int32> occurances = new Dictionary<String, Int32>
        {
            { "123", 0 },
            { "132", 0 },
            { "213", 0 },
            { "231", 0 },
            { "312", 0 },
            { "321", 0 }
        };

        Char[] digits = new[] { '1', '2', '3' };
        Func<Char[], Int32, Int32, Char[]> swap = delegate(Char[] input, Int32 pos1, Int32 pos2)
        {
            Char[] result = new Char[] { input[0], input[1], input[2] };
            Char temp = result[pos1];
            result[pos1] = result[pos2];
            result[pos2] = temp;
            return result;
        };

        for (Int32 index1 = 0; index1 < 3; index1++)
        {
            Char[] level1 = swap(digits, 0, index1);
            for (Int32 index2 = 0; index2 < 3; index2++)
            {
                Char[] level2 = swap(level1, 1, index2);
                for (Int32 index3 = 0; index3 < 3; index3++)
                {
                    Char[] level3 = swap(level2, 2, index3);
                    String output = new String(level3);
                    occurances[output]++;
                }
            }
        }

        foreach (var kvp in occurances)
        {
            Console.Out.WriteLine(kvp.Key + ": " + kvp.Value);
        }
    }
}

この出力:

123: 4
132: 5
213: 5
231: 5
312: 4
321: 4

したがって、この答えは実数ではなく、純粋に数学的に答え、すぐに評価可能な方法のランダム機能で、最終的な出力端子です。

他のヒント

この:
の危険Naïveté(コホラー)

見てみましょうおつカードセットを例にしています。3カードデッキ、6でのデッキした後、シャッフル: 123, 132, 213, 231, 312, 321.

お1stアルゴリズムがあり27可能路(成果)のコードによっては、結果の rand() 機能の異なる。それぞれの成果もが偏りのない).それぞれの成果を地図と同じ単結果のリストからの6で"リアル"シャッフルでの結果です。私た27項目および6でバケツに入ってます。以来、27日には均等割り6が6の組み合わせ 必要 き-表現されています。

2回目のアルゴリズムが6で成果を地図からでしょう6つの可能な"リアル"シャッフルの結果は、すべて表される。

ですので、この点は重要で、バケットする上で表される最初のアルゴリズムではないかせとなります。のバケットのバイアスには再現性 予測可能であ していただけ棟オンラインポーカーゲームの1stアルゴリズムのアップが行使のナイーブなソートとその作品が特定のデッキの手配も起きやすくなると考えられます。そのときにベットします。その一部を失いが、いよいよ勝どのように素早くれます。

からのコメントのその他の回答、こを探していないかについての説明がなぜ流通しない 均一な分布(divisibilityの答えは簡単ではなかにも、"直感的"の説明で実際に 遠くから均一.

こちらは片道のみです。例えば、皆さんが始まり最初の配列 [1, 2, ..., n] (nが3 52など)のアルゴリズムすべて組み合均一性の確率1は最初の位置は 1/n.現在のところ、第二(訂正)アルゴリズムで 1/n, として1滞在の場合は場合にだけは入れ替えの時間は、iffの最初の呼び出 rand(0,n-1) 0を返します。
しかし、最初の(間違ったアルゴリズム1でも残るのみであれば 入れ替えの時間 その他の時間のみの場合の rand 0を返す なし その他の randsを返します0の確率である(1/n)*(1-1/n)^(n-1)≈1/(ne)≈0.37/nは1行われています。

ことになるが、"直感的"説明:お初のアルゴリズムと、それ以前の項目にくを入れ替えの場所以降の項目の組み合わく歪に向けてパターンの早期項目 ない 元ます。

(奥高尾にひっそりと建つ料亭。より繊細な、例えば1取得でき替え入り後位置が入れ替わっバを通して複雑なシリーズのスワップ、その確率は比較的大きい。)

の説明などの見この効果からはJeff Atwoodた CodingHorror ブログの危険Naïveté).

このコードをシミュレーション3-カードをランダムシャッフル...

for (int i = 0; i < cards.Length; i++)
{
    int n = rand.Next(cards.Length);
    Swap(ref cards[i], ref cards[n]);
}

...んです。

Distribution of 3-card shuffle

シャッフルコード(上)成果3^3(27)でデッキの組み合わせとなります。が、数学を考えるとみ3!または6の組み合わせが可能で3カードデッキ。なので組み合わせ上表現されています。

きを利用する必要があり フィッシャー-イェイツシャッフル を適切に(ランダムに)シャッフルでデッキのです。

こちらは別勘:単一のシャッフルスワップできない創造の対称性の確率を占める位置にいない限り少なくとも2方向の対称性は既に存在しています。電話の位置A、B、C現在のようにの確率でカード2の位置A、bの確率でのカード2の位置B、cの確率での位置をCとして、前のスワップ移動します。うな確率テートメントは同じになります。a!=b!=c,c!=a.現在の計算の確率a'b'c'のカードがこれら三つの位置を下にスワップ.ついこのスワップ移動の位置をCと入れ替わりに位置。その後:

a' = a*2/3 + c*1/3
b' = b*2/3 + c*1/3
c' = 1/3.

それは、そのカードの巻き位置を確率であったの2/3の時間の位置なのスワップの確率での位置C倍の約1/3の確率C、差し替え情報を提供しています。今を差し引いた最初の二つの方程式は、以下になります。

a' - b' = (a - b)*2/3

ることが想定しました。=b、'!=b"ものアプローチが0の時、十分なスワップので、'+b+c=1の場合'!=b'、その後も自動車メーカーをはじめとするc'のいずれかである1/3.その確率を始め全ての異なる前にスワップもすべての違後のスワップ.この開催な位置を入れ替えただけでインターの役割の変数には上の図のようになります。

現在の非常に最初のスワップの開始による入れ替えカード1に位置します。この場合、また双方向対称になる前に交換したいと思っている人が多いのカードを1の位置をB=確率のカードを1の位置でC=0になります。でも、カード1では風と対称確率では終わることにより発生すること位置を等確率.これはすべてその後のスワップ.がカード2巻に位置後の最初のスワップ確率(1/3,2/3,0)と同様にカード3巻の位置を確率(1/3型,0,2/3).うどその後の多くのスワップいたしません風とカード2または3を同じ確率を占めてます。

の符号化ホラーポスト の危険Naïveté.

基本的には(suposing3カード):

のナイーブシャッフルの結果33(27) 可能なデッキの組み合わせとなります。ことになる 奇数、偶数の数学教えて ることから3!6 の可能な組み合わせ、3カード デッキ。のKFYシャッフルを開始 当初、スワップから 第三に位置しているので三 カードをスワップなどから 位置、残りの二つです。

シンプルに答えると、あ52^52可能なこのアルゴリズムの実行、さまざまな52!きの手配52枚のカードの.のためのアルゴリズムをすることでニーズをそれぞれの手配等があると思われます。52^52ではない整数の倍数52!.このため、これらの手配となりますので、見ています。

例示する考え方もあるこの:

1)検討のみ3です。

2)のアルゴリズムを均一に分散し、結果に"1"を終えて"0"にする必要の1/3ののチャンス"2"終[1]が必要の1/3にすぎです。

3)今回のアルゴリズム

確率"1"を終了でa[0]:"0"とした場合、乱数の発生 で1ケース(0,1,2で 1の3=1/3

確率で"2"終了でa[1]:できな入れ替えるa[0] 初めてではなく入れ替わり a[2]第二時間:2/3*1/2= 1/3

る確実性"3"終了で[2]:できな入れ替えるa[0] 初めてではなく入れ替わり a[1]第二時間:2/3*1/2= 1/3

彼らはすべて完全に1/3ま いエラーです。

4)みんなでやればである確率を計算するために"1"の予想として[0]の最初のアルゴリズムにより計算されるビット長、イラストlassevkの答えを示し、9/27=1/3が、"2"終わりとして[1]のチャンスの8/27、"3"終了している[2]にな9/27=1/3.

その結果、"2"終わりとして[1]ではないの1/3およびそのためのアルゴリズムを演出しまかに偏った結果約3.7%というエラーに対して他の無視できる場合など3/10000000000000=0.00000000003%)

5)が、ジョエルCoehoornは、実際に証明することはできる場合があると、過剰表現されています。私の説明るいはn^nはこの:各反復がnのランダム番号で、その後n繰り返しができるn^nの場合=27.この番号な配配当のpermuations(n!=3!=6)での公平n=3の場合、結果は過表現されています。その上で表されるような説明が4回で5時間を大幅に短縮できればシャッフルのカード単位百万倍から最初の1-52の代表である場合に表示されます5万回と4万倍も大きます。

6)思の表示が"なぜ"との表現失業が生まれるのでしょうか。

7)最終試験のためのアルゴリズムを修正する場合には1/n確率末を提供しているので、どんなスロットに実装されていません。

ここでの分析の カードの回転はマルコフ連鎖.あお待ち名がこの記事を評価していmath.います。:)

のナイーブアルゴリズムをピックの値がnのように:

n=ランド(3)

n=ランド(3)

n=ランド(3)

3^3の組み合わせが可能n

1,1,1, 1,1,2....3,3,2 3,3,3 (27 組み合わせ)lassevkの回答の分布の中ではカードのこれらの組み合わせとなります。

により実用的なアルゴリズムの開発には:

n=ランド(3)

n=ランド(2)

n!の組み合わせが可能n

1,1, 1,2, 2,1 2,2 3,1 3,2 (6 の組み合わせ、そのとは異なる結果)

としてのその他の答えば27回6結果は、できるものではありません達の6結果にも分布から27日(日で割れないよ6.入27ビー玉を6でバケツやない、バケツのよう大理石、最高のできないとす4,4,4,5,5,5ビー玉のためのバケット1から6.

の根本的な問題のナイーブシャッフルはスワップも多く、シャッフルで3カードを完全にするだけでなくスワップ2、スワップがあり、中には最初の二つのカードには、3カードがあったので1/3型の入れ替え.引き続きスワップカードを与えるチャンスを指定したカードを入れ替え、これらのチャンスのみについても1/3を1/3の1/3の場合スワップの組み合わせで割れる6.

なる別の回答が必要ないのでしょう仕組み合わせによって生み出そのフィッシャー-イェイツ 一律です。

さまざまなデッキをN、この質問はどのようにその

Pr(Item i ends up in slot j) = 1/N?

かとの条件付き確率、 Pr(item i ends up at slot j)

Pr(item i ends up at slot j | item i was not chosen in the first j-1 draws)
* Pr(item i was not chosen in the first j-1 draws).

からあると拡大再帰的に最初のを描いています。

現在、確率る要素 i ませんでした描かれたのですが N-1 / N.の確率で描画されませんの描画 条件のように変動するものではない"と描かれた最初の描画N-2 / N-1 います。

そこで、取得の確率要素 i ませんでした描かれた最初の j-1 注:

(N-1 / N) * (N-2 / N-1) * ... * (N-j / N-j+1)

もちろんこの確率でが描かれたラウンド j 条件とされていないこと描かれ以前1 / N-j.

この初期の分子すべてを解除、その後の要素(すなわち N-1 解除, N-2 を取り消し、 N-j+1 解除くだけで N-j / N).

なので、全体の確率要素 i に登場するスロット j

[(N-1 / N) * (N-2 / N-1) * ... * (N-j / N-j+1)] * (1 / N-j)
= 1/N

として期待される。

により一般的に簡単なシャッフル"は、特定の物件では足りないといい 交換性.のための"経路依存性"のシャッフルを作成し(の27経路は、出力することはできませんの異なるコンポーネントとランダム変数も表示されます。を使うことが可能ですか 動の例ではその方向に向かの事項にランダムサンプリングします。

の明確な答えを示す最初のアルゴリズムの失敗は、アルゴリズムの問題としてマルコフ連鎖のnの手順にグラフn!頂点のすべての.nは自然数です。アルゴリズムのホップからの頂点に移行する。最初のアルゴリズムの遷移確率の 1/n ホップ毎.がn^nの経路の確率でそれぞれ 1/n^n.ここで、最終確率の上陸の各頂点が 1/n! は減に成功した。めることが必要になりmパスと同じ最終頂点になること m/n^n=1/n! または n^n = mn! 一部の自然数 m, 又はその n^n で割れる n!.がることは不可能である。その他、nは割り n-1 ならではの場合 n=2.しての矛盾に満ちているものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top