Corrélation entre deux jeux de cartes?

11

J'ai écrit un programme pour simuler un pronation aléatoire de la carte.

Chaque carte est numérotée, avec une couleur allant de CLUBS, DIAMONDS, HEARTS, SPADESet allant de deux à dix, puis Jack, Queen, King et Ace. Ainsi, les deux clubs ont un nombre de 1, les trois clubs un 2 .... L'as des clubs est 13 ... L'as de pique est 52.

L'une des méthodes permettant de déterminer le mélange des cartes est de la comparer à une carte non mélangée et de voir si l'ordre des cartes est corrélé.

Autrement dit, je pourrais avoir ces cartes, avec la carte non mélangée pour comparaison:

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

La corrélation par la méthode Pearson serait: 0,6

Avec un grand jeu de cartes (toutes les 52), vous pourriez voir des modèles émerger. Mon hypothèse est qu'après plus de remaniements, vous obtiendrez moins de corrélation.

Cependant, il existe de nombreuses façons de mesurer la corrélation.

J'ai essayé la corrélation de Pearson mais je ne sais pas si c'est la bonne corrélation à utiliser dans cette situation.

Est-ce une mesure de corrélation appropriée? Existe-t-il une mesure plus adaptée?

Points bonus Je vois parfois ce type de données dans mes résultats:

Exemple de corrélation de carte

De toute évidence, il existe une certaine corrélation, mais je ne sais pas comment vous mesurez les différentes «lignes de tendance»?

Pureferret
la source
Pour nous aider à mieux comprendre ce que vous voulez, vous pourriez peut-être être un peu plus précis sur ce que vous entendez par «l'ordre des cartes est corrélé».
whuber
@whuber, je pense que l'OP signifie la position d'une carte donnée avant de mélanger et après. Par exemple, l'as de cœur aurait pu être 3e du haut avant et 8e après.
gung - Rétablir Monica
Je me demande si par "shuffle overhand", vous voulez dire ce que Wikipedia appelle un "shuffle riffle"?
gung - Rétablir Monica
1
@gung, la page wikipedia à laquelle vous avez lié contient des entrées pour le "shuffle shiffle" et le "shuffle overhand" dont parlait l'OP. C'est bon de lire les liens vers
lesquels
1
@Pureferret Dans ce cas, je vais reformuler. Vous devez calculer les mesures de corrélation de rang.
tchakravarty

Réponses:

14

Vous pouvez mesurer le niveau relatif de corrélation (ou plus précisément, le niveau croissant de caractère aléatoire) en utilisant l' entropie de Shannon de la différence de valeur nominale entre toutes les paires de cartes adjacentes.

Voici comment le calculer, pour un jeu de 52 cartes mélangées au hasard. Vous commencez par faire une boucle sur tout le jeu et créer une sorte d'histogramme. Pour chaque position de carte , calculez la différence de valeur faciale . Pour rendre cela plus concret, disons que la carte en ème position est le roi de pique, et la carte en ème position est le quatre de clubs. Nous avons alors et et . Lorsque vous arrivez à , c'est un cas spécial; vous retournez au début du jeu et prenezi=1,2,...,52ΔFi=Fi+1Fi(i+1)iFi+1=51Fi=3ΔFi=513=48i=52ΔF52=F1F52. Si vous vous retrouvez avec des nombres négatifs pour l'un des , ajoutez 52 pour ramener la différence de valeur faciale dans la plage 1-52.ΔF

Vous vous retrouverez avec un ensemble de différences de valeur nominale pour 52 paires de cartes adjacentes, chacune tombant dans une plage autorisée de 1-52; compter la fréquence relative de ceux-ci en utilisant un histogramme (c.-à-d. un tableau unidimensionnel) avec 52 éléments. L'histogramme enregistre une sorte de «distribution de probabilité observée» pour le jeu; vous pouvez normaliser cette distribution en divisant les nombres dans chaque casier par 52. Vous vous retrouverez ainsi avec une série de variables où chacune peut prendre un discret plage de valeurs possibles: {0, 1/52, 2/52, 3/52, etc.} selon le nombre de différences de valeur faciale par paire qui se sont retrouvées au hasard dans une case particulière de l'histogramme.p1,p2,...p52

Une fois que vous avez l'histogramme, vous pouvez calculer l'entropie de Shannon pour une itération de mélange particulière comme

E=k=152pkln(pk)
J'ai écrit une petite simulation en R pour démontrer le résultat. Le premier graphique montre comment l'entropie évolue au cours de 20 itérations de mélange. Une valeur de 0 est associée à un jeu parfaitement ordonné; des valeurs plus élevées signifient un jeu qui est progressivement plus désordonné ou décorrélé. Le deuxième graphique montre une série de 20 facettes, chacune contenant un graphique similaire à celui qui était initialement inclus avec la question, montrant l'ordre des cartes mélangées par rapport à l'ordre initial des cartes. Les 20 facettes du 2e tracé sont les mêmes que les 20 itérations du premier tracé, et elles sont également codées par couleur de la même manière, afin que vous puissiez avoir une idée visuelle du niveau d'entropie de Shannon correspondant au degré d'aléa l'ordre de tri. Le code de simulation qui a généré les tracés est ajouté à la fin.

Entropie d'informations de Shannon vs itération aléatoire

Ordre de mélange vs ordre de départ pour 20 itérations de mélange, montrant que les cartes deviennent progressivement moins corrélées et plus aléatoires au fil du temps.

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"))
stachyra
la source
2

Je sais que ce poste a presque 4 ans, mais je suis un cryptanalyste amateur et j'étudie les chiffres des cartes à jouer . En conséquence, je suis revenu à maintes reprises sur ce post pour expliquer le brassage de deck comme une source d'entropie pour la saisie aléatoire du deck. Enfin, j'ai décidé de vérifier la réponse par stachyre en mélangeant le jeu à la main et en estimant l'entropie du jeu après chaque mélange.

TL; DR, pour maximiser l'entropie du pont:

  • Pour un brassage rapide seulement, vous avez besoin de 11 à 12 shuffles.
  • Pour couper le pont en premier, puis mélanger les riffles, vous n'avez besoin que de 6-7 coupes-et-shuffles.

Tout d'abord, tout ce que Stachyra a mentionné pour calculer l'entropie de Shannon est correct. Il peut se résumer ainsi:

  1. Attribuez numériquement une valeur unique à chacune des 52 cartes du jeu.
  2. Mélangez le jeu.
  3. Pour n = 0 à n = 51, enregistrer chaque valeur de (n - (n + 1) mod 52) mod 52
  4. Comptez le nombre d'occurrences de 0, 1, 2, ..., 49, 50, 51
  5. Normaliser ces enregistrements en divisant chacun par 52
  6. Pour i = 1 à i = 52, calculez -p_i * log (p_i) / log (2)
  7. Additionner les valeurs

Là où stachyra fait une supposition subtile, c'est que la mise en œuvre d'un remaniement humain dans un programme informatique va venir avec des bagages. Avec les cartes à jouer sur papier, au fur et à mesure qu'elles s'utilisent, l'huile de vos mains est transférée sur les cartes. Sur une longue période, en raison de l'accumulation d'huile, les cartes commenceront à coller ensemble, et cela se terminera dans votre mélange. Plus le jeu est utilisé, plus deux cartes adjacentes ou plus sont susceptibles de rester ensemble, et plus cela se produit fréquemment.

De plus, supposons que les deux clubs et le valet de cœur restent ensemble. Ils peuvent finir coincés ensemble pendant la durée de votre brassage, sans jamais se séparer. Cela pourrait être imité dans un programme informatique, mais ce n'est pas le cas avec la routine R de stachyra.

De plus, stachyra a une variable de manipulation "mixprob". Sans bien comprendre cette variable, c'est un peu une boîte noire. Vous pouvez le définir de manière incorrecte, affectant les résultats. Donc, je voulais m'assurer que son intuition était correcte. Je l'ai donc vérifié à la main.

J'ai mélangé le jeu 20 fois à la main, dans deux cas différents (40 mélanges au total). Dans le premier cas, je viens de mélanger, en gardant les coupes droite et gauche presque égales. Dans le deuxième cas, j'ai coupé délibérément le jeu loin du milieu du jeu (1/3, 2/5, 1/4, etc.) avant de faire une coupe uniforme pour le shuffle du fusil. Mon instinct dans le deuxième cas était qu'en coupant le pont avant de mélanger, et en restant loin du milieu, je pouvais introduire la diffusion dans le pont plus rapidement que le brassage de fusil d'origine.

Voici les résultats. Tout d'abord, le réarrangement du fusil droit:

Entropie par carte avec réarrangement de fusil

Et voici couper le pont combiné avec un mélange de fusils:

Entropie par carte avec découpage et réarrangement du fusil

Il semble que l'entropie soit maximisée dans environ la moitié du temps de la revendication par stachyra. De plus, mon intuition était correcte: couper le pont délibérément loin du milieu en premier, avant de mélanger le fusil, introduisait plus de diffusion dans le pont. Cependant, après environ 5 shuffles, cela n'avait plus vraiment d'importance. Vous pouvez voir qu'après environ 6-7 shuffles, l'entropie est maximisée, contre 10-12 car la revendication a fait mon stachyre. Serait-il possible que 7 shuffles soient suffisants, ou suis-je aveuglé?

Vous pouvez voir mes données sur Google Sheets . Il est possible que j'aie enregistré une ou deux cartes à jouer de manière incorrecte, donc je ne peux pas garantir une précision de 100% avec les données.

Il est important que vos résultats soient également vérifiés de manière indépendante. Brad Mann, du Département de mathématiques de l'Université de Harvard, a étudié le nombre de fois qu'il faudrait pour mélanger un jeu de cartes avant que la prévisibilité d'une carte du jeu soit complètement imprévisible (l'entropie de Shannon est maximisée). Ses résultats se trouvent dans ce PDF de 33 pages .

Ce qui est intéressant avec ses conclusions, c'est qu'il vérifie en fait de manière indépendante un article du Persi Diaconis publié dans le New York Times en 1990 , qui prétend que 7 shuffles sont suffisants pour bien mélanger un jeu de cartes via le riffle shuffle.

Brad Mann parcourt quelques modèles mathématiques différents dans le brassage, y compris les chaînes de Markov, et arrive à la conclusion suivante:

C'est environ 11,7 pour n = 52, ce qui signifie que, selon ce point de vue, on s'attend en moyenne à 11 ou 12 shuffles pour randomiser un vrai jeu de cartes. Notez que cela est nettement supérieur à 7.

Brad Mann vient de vérifier indépendamment le résultat de Stachyra, et non le mien. J'ai donc regardé mes données de plus près et j'ai découvert pourquoi 7 shuffles ne suffisaient pas. Tout d'abord, l'entropie théorique maximale de Shannon en bits pour n'importe quelle carte du jeu est log (52) / log (2) ~ = 5,7 bits. Mais mes données ne cassent jamais vraiment bien au-dessus de 5 bits. Curieux, j'ai créé un tableau de 52 éléments en Python, mélangé ce tableau:

>>> 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]

Le calcul de son entropie par carte donne environ 4,8 bits. Faire cela une douzaine de fois montre des résultats similaires variant entre 5,2 bits et 4,6 bits, avec 4,8 à 4,9 comme moyenne. Donc, regarder la valeur d'entropie brute de mes données ne suffit pas, sinon je pourrais l'appeler bien à 5 shuffles.

Quand je regarde de plus près mes données, j'ai remarqué le nombre de "zéro seaux". Ce sont des compartiments où il n'y a pas de données pour les deltas entre les faces de carte pour ce nombre. Par exemple, lors de la soustraction de la valeur de deux cartes adjacentes, il n'y a pas de résultat "15" après que les 52 deltas ont été calculés.

Je vois qu'il finit par s'installer autour de 17-18 "zéro seaux" autour de 11-12 shuffles. Effectivement, mon deck mélangé via Python fait en moyenne 17-18 "zéro seau", avec un maximum de 21 et un minimum de 14. Pourquoi 17-18 est le résultat réglé, je ne peux pas l'expliquer ... pour le moment. Mais, il semble que je veuille à la fois ~ 4,8 bits d'entropie ET 17 "seaux zéro".

Avec mon stock de fusils, c'est 11-12 shuffles. Avec mon découpage, c'est 6-7. Donc, en ce qui concerne les jeux, je recommanderais de couper et mélanger. Non seulement cela garantit que les cartes du haut et du bas se mélangent dans le jeu à chaque mélange, c'est aussi tout simplement plus rapide que les 11 à 12 mélanges. Je ne sais pas pour vous, mais quand je joue à des jeux de cartes avec ma famille et mes amis, ils ne sont pas assez patients pour que je fasse 12 shuffles shiffles.

Aaron Toponce
la source