Correlação entre dois baralhos de cartas?

11

Eu escrevi um programa para simular um embaralhamento de cartão overhand .

Cada carta é numerada, com o naipe passando CLUBS, DIAMONDS, HEARTS, SPADESe a classificação de Dois a Dez, depois Valete, Rainha, Rei e Ás. Assim, o Two of Clubs tem um número 1, o Three of Clubs um 2 .... O Ace of Clubs tem 13 ... O Ace of Spades tem 52.

Um dos métodos para determinar como as cartas são embaralhadas é compará-lo a uma carta não embaralhada e verificar se a ordem das cartas está correlacionada.

Ou seja, eu posso ter estes cartões, com o cartão não embaralhado para comparação:

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

A correlação pelo método de Pearson seria: 0,6

Com um grande conjunto de cartas (todas as 52), você pode ver padrões emergindo. Minha hipótese é que, após mais embaralhamento, você terá menos correlação.

No entanto, existem várias maneiras de medir a correlação.

Eu tentei a correlação de Pearson, mas não tenho certeza se essa é a correlação correta a ser usada nessa situação.

Essa é uma medida de correlação adequada? Existe uma medida mais adequada?

Pontos de bônus Às vezes, vejo esse tipo de dados nos meus resultados:

Correlação de Cartão de Amostra

Claramente, há alguma correlação, mas não sei como você mede as 'linhas de tendência' separadas?

Pureferret
fonte
Para nos ajudar a entender melhor o que você deseja, talvez seja um pouco mais preciso o que você quer dizer com "a ordem dos cartões está correlacionada".
whuber
@whuber, acho que o OP significa a posição de um determinado cartão antes de embaralhar e depois. Por exemplo, o ás de copas pode ter sido o terceiro do topo antes e o oitavo depois.
gung - Restabelece Monica
Eu me pergunto se por "embaralhamento overhand", você quer dizer o que a Wikipedia chama de "embaralhamento riffle"?
gung - Restabelece Monica
11
@gung a página da wikipedia à qual você vinculou tem entradas para "riffle shuffle" e "overhand shuffle" que o OP estava falando. É bom para ler os links que você apontam para :)
bdeonovic
11
@Pureferret Nesse caso, vou reformular. Você deve calcular as medidas de correlação de classificação.
Tchakravarty

Respostas:

14

Você pode medir o nível relativo de correlação (ou mais precisamente, o nível crescente de aleatoriedade) usando a entropia de Shannon da diferença no valor de face entre todos os pares de cartas adjacentes.

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

p1,p2,...p52

E=k=152pkln(pk)
Eu escrevi uma pequena simulação em R para demonstrar o resultado. O primeiro gráfico mostra como a entropia evolui ao longo de 20 iterações aleatórias. Um valor 0 é associado a um baralho perfeitamente ordenado; valores maiores significam um baralho que é progressivamente mais desordenado ou correlacionado. O segundo gráfico mostra uma série de 20 facetas, cada uma contendo um gráfico semelhante ao que foi originalmente incluído na pergunta, mostrando a ordem aleatória das cartas versus a ordem inicial. As 20 facetas no segundo gráfico são as mesmas que as 20 iterações no primeiro gráfico, e também são codificadas por cores da mesma forma, para que você possa ter uma ideia visual de qual nível de entropia de Shannon corresponde a quanto aleatoriedade a ordem de classificação. O código de simulação que gerou os gráficos é anexado no final.

Entropia de informações de Shannon x iteração aleatória

Ordem aleatória vs. ordem inicial para 20 iterações de reprodução aleatória, mostrando cartas cada vez menos correlacionadas e distribuídas aleatoriamente ao longo do tempo.

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

Eu sei que este post tem quase 4 anos, mas sou um criptoanalista amador e tenho estudado cifras de cartas de baralho . Como resultado, voltei repetidamente a este post para explicar a baralhamento do baralho como fonte de entropia para a digitação aleatória do baralho. Finalmente, decidi verificar a resposta por stachyra embaralhando o baralho manualmente e calculando a entropia do baralho após cada baralhamento.

TL; DR, para maximizar a entropia do convés:

  • Para embaralhar apenas riffle, você precisa de 11 a 12 embaralhamento.
  • Para cortar o baralho primeiro e depois embaralhar com rapidez, você precisa apenas de 6 a 7 cortes e embaralhamento.

Primeiro, tudo o que a stachyra mencionou para calcular a entropia de Shannon está correto. Pode ser resumido desta maneira:

  1. Atribua numericamente um valor único a cada uma das 52 cartas do baralho.
  2. Embaralhe o baralho.
  3. Para n = 0 a n = 51, registre cada valor de (n - (n + 1) mod 52) mod 52
  4. Conte o número de ocorrências de 0, 1, 2, ..., 49, 50, 51
  5. Normalize esses registros dividindo cada um por 52
  6. Para i = 1 a i = 52, calcule -p_i * log (p_i) / log (2)
  7. Soma os valores

Onde stachyra faz uma suposição sutil, é que implementar um embaralhamento humano em um programa de computador virá com alguma bagagem. Com as cartas de baralho em papel, à medida que elas são usadas, o óleo das suas mãos é transferido para as cartas. Por um longo período de tempo, devido ao acúmulo de óleo, os cartões começarão a ficar colados e isso acabará no seu embaralhamento. Quanto mais usado o baralho, maior a probabilidade de duas ou mais cartas adjacentes ficarem juntas e mais frequentemente isso acontecerá.

Além disso, supõe-se que os dois clubes e valete de copas permaneçam juntos. Eles podem acabar presos juntos pela duração do embaralhamento, nunca se separando. Isso pode ser imitado em um programa de computador, mas esse não é o caso da rotina R da stachyra.

Além disso, stachyra tem uma variável de manipulação "mixprob". Sem entender completamente essa variável, é um pouco de uma caixa preta. Você pode configurá-lo incorretamente, afetando os resultados. Então, eu queria ter certeza de que sua intuição estava correta. Então eu verifiquei à mão.

Embaralhei o baralho 20 vezes com a mão, em dois casos diferentes (40 no total). Em um primeiro momento, eu apenas embaralhei, mantendo os cortes direito e esquerdo quase iguais. Na segunda instância, cortei o deck deliberadamente para longe do meio do deck (1/3, 2/5, 1/4 etc.) antes de fazer um corte uniforme para a reprodução aleatória. Meu instinto, no segundo caso, foi que, cortando o convés antes de embaralhar, e ficando longe do meio, eu poderia introduzir difusão no convés mais rapidamente do que embaralhar normalmente.

Aqui estão os resultados. Primeiro, embaralhamento direto da espingarda:

Entropia por cartão com reprodução aleatória

E aqui está o corte do baralho combinado com a reprodução aleatória:

Entropia por cartão com corte e reprodução aleatória

Parece que a entropia é maximizada em cerca de 1/2 do tempo da reivindicação por estaquira. Além disso, minha intuição estava correta ao cortar o convés deliberadamente longe do meio primeiro, antes que o embaralhamento de rifles introduzisse mais difusão no convés. No entanto, após cerca de 5 shuffles, isso realmente não importava mais. Você pode ver que, após cerca de 6 a 7 embaralhamento, a entropia é maximizada, em comparação com os 10 a 12, conforme a reivindicação fez minha estacira. Seria possível que 7 shuffles sejam suficientes ou estou sendo cego?

Você pode ver meus dados no Planilhas Google . É possível que eu tenha gravado um ou dois cartões incorretamente, por isso não posso garantir 100% de precisão com os dados.

É importante que suas descobertas também sejam verificadas independentemente. Brad Mann, do Departamento de Matemática da Universidade de Harvard, estudou quantas vezes seriam necessárias para embaralhar um baralho antes que a previsibilidade de qualquer cartão no baralho fosse completamente imprevisível (a entropia de Shannon é maximizada). Seus resultados podem ser encontrados neste PDF de 33 páginas .

O interessante de suas descobertas é que ele está realmente verificando independentemente um artigo do New York Times de 1990 por Persi Diaconis , que afirma que 7 baralhos são suficientes para misturar minuciosamente um baralho de cartas através do baralho de cartas.

Brad Mann percorre alguns modelos matemáticos diferentes em embaralhamento, incluindo cadeias de Markov, e chega à seguinte conclusão:

Isso é aproximadamente 11,7 para n = 52, o que significa que, de acordo com esse ponto de vista, esperamos que, em média, sejam necessários 11 ou 12 shuffles para randomizar um baralho real. Observe que isso é substancialmente maior que 7.

Brad Mann apenas verificou independentemente o resultado da estaquira, e não o meu. Então, olhei mais de perto meus dados e descobri por que 7 shuffles não são suficientes. Primeiro, a entropia máxima teórica de Shannon em bits para qualquer cartão no baralho é log (52) / log (2) ~ = 5,7 bits. Mas meus dados nunca quebram muito acima de 5 bits. Curioso, criei uma matriz de 52 elementos em Python, embaralhei essa 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]

O cálculo da sua entropia por cartão produz cerca de 4,8 bits. Fazer isso uma dúzia de vezes mostra resultados semelhantes, variando entre 5,2 e 4,6 bits, com média de 4,8 a 4,9. Portanto, analisar o valor bruto da entropia dos meus dados não é suficiente; caso contrário, eu poderia chamá-lo de bom em 5 shuffles.

Quando olho mais de perto meus dados, notei o número de "zero buckets". São baldes em que não há dados para deltas entre as faces do cartão para esse número. Por exemplo, ao subtrair o valor de duas cartas adjacentes, não há resultado "15" após o cálculo de todos os 52 deltas.

Vejo que, eventualmente, se instala entre 17 e 18 "zero baldes" entre 11 e 12 shuffles. Com certeza, meu baralho embaralhado via Python tem em média 17-18 "zero buckets", com um máximo de 21 e um mínimo de 14. Por que 17-18 é o resultado estabelecido, não sei explicar ... ainda. Mas, parece que eu quero os dois ~ 4,8 bits de entropia E 17 "zero buckets".

Com o meu estoque riffle baralhar, são 11-12 baralhar. Com o meu corte e reprodução aleatória, são 6-7. Então, quando se trata de jogos, eu recomendaria cortar e embaralhar. Isso não apenas garante que as cartas superior e inferior sejam misturadas no baralho em cada baralhamento, como também é mais rápido do que 11-12 baralhamento. Eu não sei sobre você, mas quando estou jogando cartas com minha família e amigos, eles não são pacientes o suficiente para eu fazer 12 baralhas aleatórias.

Aaron Toponce
fonte