Correlación entre dos mazos de cartas?

11

He escrito un programa para simular un volado de reproducción aleatoria tarjeta.

Cada carta está numerada, con el palo que va CLUBS, DIAMONDS, HEARTS, SPADESy el rango de Dos a Diez y luego Jack, Reina, Rey y As. Por lo tanto, el Two of Clubs tiene un Número de 1, el Three of Clubs un 2 ... As of Clubs es 13 ... Ace of Spades es 52.

Uno de los métodos para determinar qué tan barajadas están las cartas es compararlas con una carta no barajada y ver si el orden de las cartas está correlacionado.

Es decir, podría tener estas tarjetas, con la tarjeta no barajada para comparar:

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 correlación por el método de Pearson sería: 0.6

Con un gran conjunto de tarjetas (las 52), es posible que surjan patrones. Mi hipótesis es que después de más barajas obtendrás menos correlación.

Sin embargo, hay muchas formas de medir la correlación.

He intentado probar la correlación de Pearson, pero no estoy seguro de si esta es la correlación correcta para usar en esta situación.

¿Es esta una medida de correlación adecuada? ¿Hay alguna medida más adecuada?

Puntos de bonificación A veces veo este tipo de datos en mis resultados:

Muestra de correlación de tarjeta

Claramente, existe alguna correlación, pero no sé cómo se miden las 'líneas de tendencia' separadas.

Pureferret
fuente
Para ayudarnos a comprender mejor lo que quiere, tal vez podría ser un poco más preciso sobre lo que quiere decir con "el orden de las tarjetas está correlacionado".
whuber
@whuber, creo que el OP significa la posición de una carta determinada antes de barajar y después. Por ejemplo, el as de corazones podría haber sido tercero desde arriba y octavo después.
gung - Restablece a Monica
Me pregunto si por "barajar por encima de la mano", ¿te refieres a lo que Wikipedia llama un "barajado de rifles"?
gung - Restablece a Monica
1
@gung, la página de Wikipedia a la que se vinculó tiene entradas tanto para "riffle shuffle" como para el "overhand shuffle" del que hablaba el OP. Es bueno leer los enlaces a los que
enlazas
1
@Pureferret En ese caso, lo reformularé. Usted debe estar calculando medidas de correlación de rango.
tchakravarty

Respuestas:

14

Puede medir el nivel relativo de correlación (o más precisamente, el nivel creciente de aleatoriedad) utilizando la entropía de Shannon de la diferencia en el valor nominal entre todos los pares de cartas adyacentes.

i=1,2,...,52ΔFi=Fi+1Fi(i+1)iFi+1=51Fi=3ΔFi=513=48i=52ΔF52=F1F52ΔF

p1,p2,...p52 donde cada uno puede tomar un rango discreto de valores posibles: {0, 1/52, 2/52, 3/52, etc.} dependiendo de cuántas diferencias de valor nominal por pares terminaron aleatoriamente en un bin particular del histograma

E=k=152pkln(pk)
He escrito una pequeña simulación en R para demostrar el resultado. La primera gráfica muestra cómo evoluciona la entropía en el transcurso de 20 iteraciones aleatorias. Un valor de 0 está asociado con un mazo perfectamente ordenado; valores mayores significan un mazo que está progresivamente más desordenado o relacionado con la decoración. La segunda gráfica muestra una serie de 20 facetas, cada una de las cuales contiene una gráfica similar a la que se incluyó originalmente con la pregunta, que muestra el orden de las cartas barajadas frente al orden inicial de las cartas. Las 20 facetas en la segunda trama son las mismas que las 20 iteraciones en la primera trama, y ​​también están codificadas por color de la misma manera, para que pueda tener una idea visual de qué nivel de entropía de Shannon corresponde a la cantidad de aleatoriedad en El orden de clasificación. El código de simulación que generó los gráficos se adjunta al final.

Entropía de información de Shannon vs. iteración aleatoria

Orden aleatorio versus orden de inicio para 20 iteraciones de barajado, mostrando que las cartas se vuelven progresivamente menos correlacionadas y se distribuyen más al azar con el tiempo.

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
fuente
2

Sé que esta publicación tiene casi 4 años, pero soy un criptoanalista aficionado, y he estado estudiando juegos de cartas . Como resultado, volví a esta publicación una y otra vez para explicar el barajado de barajas como una fuente de entropía para teclear aleatoriamente la baraja. Finalmente, decidí verificar la respuesta por stachyra barajando el mazo a mano y estimando la entropía del mazo después de cada barajado.

TL; DR, para maximizar la entropía del mazo:

  • Para solo la mezcla aleatoria, necesitas 11-12 barajas.
  • Para cortar la baraja primero y luego barajar, solo necesitas 6-7 cortar y barajar.

En primer lugar, todo lo que mencionó Stachyra para calcular la entropía de Shannon es correcto. Se puede resumir de esta manera:

  1. Asigna numéricamente un valor único a cada una de las 52 cartas del mazo.
  2. Baraja la baraja.
  3. Para n = 0 a n = 51, registre cada valor de (n - (n + 1) mod 52) mod 52
  4. Cuente el número de ocurrencias de 0, 1, 2, ..., 49, 50, 51
  5. Normalice esos registros dividiendo cada uno por 52
  6. Para i = 1 a i = 52, calcule -p_i * log (p_i) / log (2)
  7. Suma los valores

Donde Stachyra hace una suposición sutil, es que implementar un shuffle humano en un programa de computadora vendrá con algo de equipaje. Con las cartas de papel, a medida que se usan, el aceite de tus manos se transfiere a las cartas. Durante un tiempo prolongado, debido a la acumulación de aceite, las tarjetas comenzarán a pegarse, y esto terminará en su barajadura. Cuanto más se use el mazo, más probable es que dos o más cartas adyacentes se unan, y con mayor frecuencia sucederá.

Además, se supone que los dos clubes y la jota de corazones se unen. Pueden terminar atrapados juntos durante la duración de su barajado, sin separarse nunca. Esto podría imitarse en un programa de computadora, pero este no es el caso con la rutina R de stachyra.

Además, stachyra tiene una variable de manipulación "mixprob". Sin comprender completamente esta variable, es un poco un cuadro negro. Podría configurarlo incorrectamente, afectando los resultados. Entonces, quería asegurarme de que su intuición fuera correcta. Entonces lo verifiqué a mano.

Barajé la baraja 20 veces a mano, en dos casos diferentes (40 barajas en total). En primera instancia, simplemente revolví los pies, manteniendo los cortes derecho e izquierdo casi parejos. En la segunda instancia, corté el mazo deliberadamente lejos del centro del mazo (1/3, 2/5, 1/4, etc.) antes de hacer un corte parejo para el riffle shuffle. Mi instinto en la segunda instancia fue que cortando la cubierta antes de barajar, y manteniéndome alejado del medio, podía introducir la difusión en la cubierta más rápidamente que la mezcla de rifles.

Aquí están los resultados. Primero, barajar el riffle recto:

Entropía por carta con barajadura

Y aquí está cortando la baraja combinada con el riffle shuffling:

Entropía por tarjeta con corte y barajadura

Parece que la entropía se maximiza en aproximadamente la mitad del tiempo de la reclamación por estaquira. Además, mi intuición era correcta: cortar el mazo deliberadamente lejos del centro primero, antes de que la combinación de rifles introdujera más difusión en el mazo. Sin embargo, después de unos 5 barajaduras, ya no importaba mucho. Puede ver que después de aproximadamente 6-7 barajaduras, la entropía se maximiza, en comparación con el 10-12, ya que la afirmación hizo que mi estaquira. ¿Podría ser posible que 7 barajaduras sean suficientes o estoy siendo cegado?

Puedes ver mis datos en Google Sheets . Es posible que haya grabado una tarjeta o dos de forma incorrecta, por lo que no puedo garantizar una precisión del 100% con los datos.

Es importante que sus hallazgos también se verifiquen independientemente. Brad Mann, del Departamento de Matemáticas de la Universidad de Harvard, estudió cuántas veces tomaría barajar un mazo de cartas antes de que la previsibilidad de cualquier carta en el mazo sea completamente impredecible (la entropía de Shannon se maximiza). Sus resultados se pueden encontrar en este PDF de 33 páginas .

Lo que es interesante con sus hallazgos es que en realidad está verificando independientemente un artículo del New York Times de 1990 escrito por Persi Diaconis , quien afirma que 7 barajaduras son suficientes para mezclar completamente una baraja de cartas a través de la barajadura.

Brad Mann recorre algunos modelos matemáticos diferentes en el barajado, incluidas las cadenas de Markov, y llega a la siguiente conclusión:

Esto es aproximadamente 11.7 para n = 52, lo que significa que, de acuerdo con este punto de vista, esperamos un promedio de 11 o 12 barajas necesarias para aleatorizar un mazo de cartas real. Tenga en cuenta que esto es sustancialmente mayor que 7.

Brad Mann simplemente verificó independientemente el resultado de Stachyra, y no el mío. Entonces, miré más de cerca mis datos y descubrí por qué 7 barajaduras no son suficientes. En primer lugar, la entropía máxima teórica de Shannon en bits para cualquier carta en el mazo es log (52) / log (2) ~ = 5.7 bits. Pero mis datos nunca se rompen realmente por encima de los 5 bits. Curioso, creé una matriz de 52 elementos en Python, barajé esa matriz:

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

Calcular su entropía por tarjeta produce unos 4,8 bits. Hacer esto una docena de veces muestra resultados similares que varían entre 5.2 bits y 4.6 bits, con 4.8 a 4.9 como promedio. Por lo tanto, mirar el valor de entropía sin procesar de mis datos no es suficiente, de lo contrario podría llamarlo bueno a 5 shuffles.

Cuando miro más de cerca mis datos, noté el número de "cubos cero". Estos son depósitos donde no hay datos para deltas entre las caras de las tarjetas para ese número. Por ejemplo, al restar el valor de dos cartas adyacentes, no hay resultado "15" después de que se hayan calculado los 52 deltas.

Veo que eventualmente se establece alrededor de 17-18 "cubos cero" alrededor de 11-12 barajadas. Efectivamente, mi baraja barajada a través de Python promedia 17-18 "cubos cero", con un máximo de 21 y un mínimo de 14. Por qué 17-18 es el resultado establecido, no puedo explicar ... todavía. Pero, parece que quiero ~ 4.8 bits de entropía Y 17 "cubos cero".

Con mi riffle de stock barajando, eso es 11-12 barajaduras. Con mi cortar y mezclar, eso es 6-7. Entonces, cuando se trata de juegos, recomendaría cortar y mezclar. Esto no solo garantiza que las cartas superior e inferior se mezclen en el mazo en cada baraja, sino que también es más rápido que 11-12 barajas. No sé sobre ti, pero cuando estoy jugando juegos de cartas con mi familia y amigos, no son lo suficientemente pacientes como para que yo pueda hacer 12 juegos aleatorios.

Aaron Toponce
fuente