カードの2つのデッキ間の相関関係?


11

オーバーハンドカードシャッフルをシミュレートするプログラムを作成しました。

各カードには番号が付けられ、スーツCLUBS, DIAMONDS, HEARTS, SPADESは2から10までのランクで、ジャック、クイーン、キング、エースの順になります。したがって、2つのクラブの数は1、3つのクラブの数は2 .... Ace of Clubsは13 ... Ace of Spadesは52です。

カードがどのようにシャッフルされているかを判別する方法の1つは、シャッフルされていないカードと比較して、カードの順序が相関しているかどうかを確認することです。

つまり、私はこれらのカードを持っているかもしれませんが、比較のためにシャッフルされていないカードがあります:

Unshuffled          Shuffled            Unshuffled number   Shuffled number
Two of Clubs        Three of Clubs      1                   2
Three of Clubs      Two of Clubs        2                   1
Four of Clubs       Five of Clubs       3                   4
Five of Clubs       Four of Clubs       4                   3

ピアソン法による相関は次のようになります:0.6

大量のカード(52枚すべて)を使用すると、パターンが出現する場合があります。私の仮説は、シャッフルを繰り返すと相関性が低下するというものです。

ただし、相関関係を測定する方法はたくさんあります。

私はピアソンの相関関係を試してみましたが、これがこの状況で使用するのに適切な相関関係であるかどうかはわかりません。

これは適切な相関測定ですか?より適切な対策はありますか?

ボーナスポイント結果に次のようなデータが表示されることがあります。

サンプルカード相関

明らかにいくつかの相関関係がありますが、個別の「トレンドライン」を測定する方法がわかりませんか?


私たちがあなたが何を望んでいるかをよりよく理解するのを助けるために、おそらくあなたは「カードの順序は相関している」とはあなたが何を意味するかについてもう少し正確かもしれません。
whuber

@whuber、私はOPがシャッフル前と後の特定のカードの位置を意味すると思います。たとえば、ハートのエースは、前から3番目、その後8番目だった可能性があります。
ガン-モニカの回復

「オーバーシャ​​ッフル」とは、ウィキペディアが「リッフルシャッフル」と呼んでいるものですか?
ガン-モニカを復活

1
@gungリンクしたウィキペディアのページには、OPが話していた「リフルシャッフル」と「オーバーハンドシャッフル」の両方のエントリがあります。あなたがリンクしているリンクを読むのは良いことです:)
bdeonovic

1
@Pureferretその場合、言い換えます。ランク相関測定を計算する必要があります
tchakravarty 2013

回答:


14

隣接するカードのすべてのペア間の面の値の差のシャノンエントロピーを使用して、相関の相対的なレベル(より正確には、ランダム性のレベルの増加)を測定できます。

52枚のカードのランダムにシャッフルされたデッキの場合、それを計算する方法は次のとおりです。まず、デッキ全体を1回ループし、一種のヒストグラムを作成します。各カード位置について、額面の差計算します。これをより具体的にするために、番目のカードがスペードのキングであり、番目のカードが4つのクラブであるとしましょう。次に、およびおよびます。到達すると、それは特殊なケースです。あなたは再びデッキの最初にループバックして、を取るi=1,2,...,52ΔFi=Fi+1Fi(i+1)iFi+1=51Fi=3ΔFi=513=48i=52ΔF52=F1F52。のいずれかが負の数になる場合は、52を追加して額面の差を1〜52の範囲に戻します。ΔF

隣接するカードの52ペアの額面の差のセットになり、各カードは1〜52の許容範囲に分類されます。52個の要素を持つヒストグラム(つまり、1次元配列)を使用して、これらの相対頻度をカウントします。ヒストグラムは、デッキの一種の「観測された確率分布」を記録します。各ビンのカウントを52で割ることにより、この分布を正規化できます。このようにして、一連の変数、それぞれが離散的になります。可能な値の範囲:{0、1 / 52、2 / 52、3 / 52など}ヒストグラムの特定のビンでペアごとの顔の値の差異の数がランダムに最終的に決まるかによって異なります。p1,p2,...p52

ヒストグラムを取得したら、特定のシャッフル反復のシャノンエントロピーをとして計算できます

E=k=152pkln(pk)
結果を示すために、Rで小さなシミュレーションを作成しました。最初のプロットは、20回のシャッフル反復の過程でエントロピーがどのように進化するかを示しています。値0は完全に順序付けられたデッキに関連付けられています。値が大きいほど、無秩序または無相関のデッキが増えていることを示します。2番目のプロットは、一連の20のファセットを示します。各ファセットには、最初に質問に含まれていたものと同様のプロットが含まれており、シャッフルされたカードの順序と最初のカードの順序を示しています。2番目のプロットの20のファセットは最初のプロットの20回の反復と同じであり、それらも同じように色分けされているため、シャノンエントロピーのどのレベルがどの程度のランダム性に対応するかについて視覚的な感覚を得ることができますソート順。プロットを生成したシミュレーションコードが最後に追加されます。

シャノン情報エントロピー対シャッフル反復

シャッフルの20反復のシャッフル順序と開始順序。カードが徐々に相関性を失い、時間の経過とともにランダムに分散されることを示します。

library(ggplot2)

# Number of cards
ncard <- 52 
# Number of shuffles to plot
nshuffle <- 20
# Parameter between 0 and 1 to control randomness of the shuffle
# Setting this closer to 1 makes the initial correlations fade away
# more slowly, setting it closer to 0 makes them fade away faster
mixprob <- 0.985 
# Make data frame to keep track of progress
shuffleorder <- NULL
startorder <- NULL
iteration <- NULL
shuffletracker <- data.frame(shuffleorder, startorder, iteration)

# Initialize cards in sequential order
startorder <- seq(1,ncard)
shuffleorder <- startorder

entropy <- rep(0, nshuffle)
# Loop over each new shuffle
for (ii in 1:nshuffle) {
    # Append previous results to data frame
    iteration <- rep(ii, ncard)
    shuffletracker <- rbind(shuffletracker, data.frame(shuffleorder,
                            startorder, iteration))
    # Calculate pairwise value difference histogram
    freq <- rep(0, ncard)
    for (ij in 1:ncard) {
        if (ij == 1) {
            idx <- shuffleorder[1] - shuffleorder[ncard]
        } else {
            idx <- shuffleorder[ij] - shuffleorder[ij-1]
        }
        # Impose periodic boundary condition
        if (idx < 1) {
            idx <- idx + ncard
        }
        freq[idx] <- freq[idx] + 1
    }
    # Sum over frequency histogram to compute entropy
    for (ij in 1:ncard) {
        if (freq[ij] == 0) {
            x <- 0
        } else {
            p <- freq[ij] / ncard
            x <- -p * log(p, base=exp(1))
        }
        entropy[ii] <- entropy[ii] + x
    }
    # Shuffle the cards to prepare for the next iteration
    lefthand <- shuffleorder[floor((ncard/2)+1):ncard]
    righthand <- shuffleorder[1:floor(ncard/2)]
    ij <- 0
    ik <- 0
    while ((ij+ik) < ncard) {
        if ((runif(1) < mixprob) & (ij < length(lefthand))) {
            ij <- ij + 1
            shuffleorder[ij+ik] <- lefthand[ij]
        }
        if ((runif(1) < mixprob) & (ik < length(righthand))) {
            ik <- ik + 1
            shuffleorder[ij+ik] <- righthand[ik]
        }
    }
}
# Plot entropy vs. shuffle iteration
iteration <- seq(1, nshuffle)
output <- data.frame(iteration, entropy)
print(qplot(iteration, entropy, data=output, xlab="Shuffle Iteration", 
            ylab="Information Entropy", geom=c("point", "line"),
            color=iteration) + scale_color_gradient(low="#ffb000",
            high="red"))

# Plot gradually de-correlating sort order
dev.new()
print(qplot(startorder, shuffleorder, data=shuffletracker, color=iteration,
            xlab="Start Order", ylab="Shuffle Order") + facet_wrap(~ iteration,
            ncol=4) + scale_color_gradient(low="#ffb000", high="red"))

2

私はこの投稿がほぼ4歳であることを知っていますが、私は趣味の暗号解読者であり、トランプ暗号を研究ています。その結果、私は何度も何度もこの投稿に戻って、デッキをランダムにキーイングするためのエントロピーのソースとしてのデッキのシャッフルについて説明しました。最後に、手でデッキをシャッフルし、シャッフルごとにデッキのエントロピーを推定することで、スタキラによる回答を検証することにしました。

TL; DR、デッキエントロピーを最大化する:

  • リフルシャッフルだけの場合、11〜12のシャッフルが必要です。
  • 最初にデッキをカットしてからシャッフルをリフリングするには、6〜7回のカットアンドシャッフルだけが必要です。

まず、スタキラがシャノンエントロピーを計算するために言及したすべてが正しいです。この方法で煮詰めることができます:

  1. デッキ内の52枚の各カードに一意の値を数値で割り当てます。
  2. デッキをシャッフルする。
  3. n = 0からn = 51の場合、(n-(n + 1)mod 52)mod 52の各値を記録します
  4. 0、1、2、...、49、50、51の出現回数を数える
  5. 各レコードを52で割って正規化する
  6. i = 1からi = 52の場合、-p_i * log(p_i)/ log(2)を計算します
  7. 値を合計する

stachyraが1つの微妙な仮定をするところは、コンピュータープログラムで人間のシャッフルを実装することはいくつかの手荷物を伴うことになるということです。紙ベースのトランプでは、慣れるにつれて、手からの油がカードに移ります。オイルの蓄積により、長期間にわたってカードがくっつき始め、これが最終的にシャッフルになります。デッキを頻繁に使用するほど、隣接する2枚以上のカードがくっつく可能性が高くなり、頻繁に発生します。

さらに、2つのクラブとジャックオブハートがくっついていると考えられます。それらは、あなたのシャッフルの期間中、一緒に立ち往生し、分離することはありません。これはコンピュータープログラムで模倣される可能性がありますが、スタキラのRルーチンには当てはまりません。

また、stachyraには操作変数「mixprob」があります。この変数を完全に理解していなければ、それはブラックボックスの少しです。誤って設定すると、結果に影響を与える可能性があります。だから、私は彼の直感が正しいことを確認したかったのです。それで手作業で確認しました。

デッキを手作業で20回シャッフルしました(2つの異なるインスタンス(合計40シャッフル))。最初の例では、右と左のカットをほぼ同じに保ちながら、シャッフルしてシャッフルしました。2番目の例では、デッキの中央から意図的に離れてデッキをカットし(1 / 3、2 / 5、1 / 4など)、リフルシャッフルを均等にカットしました。2番目のインスタンスで私の直感は、シャッフルする前にデッキをカットし、中央から遠ざけることで、ストックのリフルシャッフルよりも速く拡散をデッキに導入できるということでした。

結果は次のとおりです。まず、ストレート・リフル・シャッフル:

リフルシャッフルを使用したカードごとのエントロピー

そして、ここでは、ライフルのシャッフルと組み合わせてデッキをカットしています:

カードごとのエントロピー、カッティングとリフルシャッフル

エントロピーはスタキラによる主張の約半分の時間で最大化されるようです。さらに、私が直感したとおり、最初にデッキを真ん中から慎重に切り取ってから、リフルシャッフルによってデッキにさらに拡散を導入しました。ただし、約5回のシャッフルの後は、それほど問題になりませんでした。約6〜7回のシャッフル後、エントロピーが最大化されているのがわかります。10〜12の場合、スタキラが主張されているためです。7シャッフルで十分か、私は盲目か?

私のデータはGoogleスプレッドシートで確認できます。1枚または2枚のトランプを誤って記録した可能性があるため、データの100%の精度を保証できません。

調査結果も個別に検証することが重要です。ハーバード大学数学部のブラッドマンは、デッキのカードの予測可能性が完全に予測不能になる(シャノンエントロピーが最大化される)までに、デッキのカードをシャッフルするのに何回かかるかを調査しました。彼の結果はこの33ページのPDFにあります。

彼の調査結果で興味深いのは、実際に独立して、Persi Diaconisよる1990 New York Timesの記事を検証ていることです。

ブラッドマンは、マルコフチェーンを含むシャッフルのいくつかの異なる数学モデルをウォークスルーし、次の結論に達します。

これは、n = 52の場合約11.7です。つまり、この観点によれば、実際のカードのデッキをランダム化するには、平均で11または12のシャッフルが必要であると予想されます。これは実質的に7よりも大きいことに注意してください。

ブラッド・マンはスタチラの結果を独自に検証しただけで、私のものではありませんでした。それで、自分のデータを詳しく調べたところ、7回のシャッフルでは不十分であることがわかりました。まず、デッキ内のカードの理論上の最大シャノンエントロピー(ビット)は、log(52)/ log(2)〜= 5.7ビットです。しかし、私のデータが5ビットをはるかに超えることはありません。興味深いことに、Pythonで52要素の配列を作成し、その配列をシャッフルしました。

>>> import random
>>> r = random.SystemRandom()
>>> d = [x for x in xrange(1,52)]
>>> r.shuffle(d)
>>> print d
[20, 51, 42, 44, 16, 5, 18, 27, 8, 24, 23, 13, 6, 22, 19, 45, 40, 30, 10, 15, 25, 37, 52, 34, 12, 46, 48, 3, 26, 4, 1, 38, 32, 14, 43, 7, 31, 50, 47, 41, 29, 36, 39, 49, 28, 21, 2, 33, 35, 9, 17, 11]

カードあたりのエントロピーを計算すると、約4.8ビットになります。これを数十回行うと、平均が4.8から4.9で、5.2ビットと4.6ビットの間で変化する同様の結果が表示されます。したがって、データの生のエントロピー値を確認するだけでは十分ではありません。それ以外の場合は、5つのシャッフルで良いと言えます。

データを詳しく見ると、「ゼロバケット」の数に気づきました。これらは、その番号のカード面間のデルタのデータがないバケットです。たとえば、2つの隣接するカードの値を減算する場合、52のデルタがすべて計算された後、「15」という結果はありません。

最終的には、17から18の「ゼロバケット」が11から12のシャッフルに落ち着くのがわかります。案の定、Pythonでシャッフルしたデッキの平均は17〜18の「ゼロバケット」で、最高値は21、最低値は14です。なぜ17-18が解決された結果なのか、まだ説明できません...まだです。しかし、私は〜4.8ビットのエントロピーと17個の「ゼロバケット」の両方が必要なようです。

私の在庫のさざ波シャッフルで、それは11-12シャッフルです。私のカットアンドシャッフルでは、6〜7です。だから、ゲームに関しては、カットアンドシャッフルをお勧めします。これは、トップとボトムのカードが各シャッフルでデッキに混合されることを保証するだけでなく、11-12シャッフルよりも単純に速いだけです。私はあなたのことは知りませんが、家族や友人とカードゲームをしているとき、私は12回のさざ波のシャッフルを実行するのに十分な忍耐力がありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.