두 카드의 카드 사이의 상관 관계


11

오버 핸드 카드 셔플 을 시뮬레이션하는 프로그램을 작성했습니다 .

각 카드는 번호가 매겨지며, 소송 CLUBS, DIAMONDS, HEARTS, SPADES은 2에서 10까지, 그 다음에는 Jack, Queen, King 및 Ace입니다. 따라서 두 클럽의 수는 1, 세 클럽의 수는 2입니다 ..... 에이스 클럽은 13입니다 ... 스페이드 에이스는 52입니다.

카드를 섞는 방법을 결정하는 방법 중 하나는 카드를 섞지 않은 카드와 비교하고 카드 순서가 상관되어 있는지 확인하는 것입니다.

즉, 비교를 위해 섞이지 않은 카드와 함께 이러한 카드가있을 수 있습니다.

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

Pearson 방법에 의한 상관 관계는 다음과 같습니다. 0.6

큰 카드 세트 (총 52 개)를 사용하면 패턴이 나타날 수 있습니다. 내 가설은 셔플을 더 많이 한 후에는 상관 관계가 적다는 것입니다.

그러나 상관 관계를 측정하는 방법에는 여러 가지가 있습니다.

피어슨의 상관 관계에 대해 손을 보았지만 이것이이 상황에서 사용하기에 적합한 상관 관계인지 확실하지 않습니다.

이것이 적절한 상관 측정입니까? 더 적합한 척도가 있습니까?

보너스 포인트 때때로 결과에 이런 종류의 데이터가 표시됩니다.

샘플 카드 상관

분명히 상관 관계가 있지만 별도의 '추세'를 어떻게 측정하는지 모르겠습니다.


우리가 원하는 것을 더 잘 이해하도록 돕기 위해, 아마도 당신은 "카드 순서가 서로 연관되어있다"는 것이 무엇을 의미하는지에 대해 조금 더 정확할 수 있습니다.
whuber

@ whuber, 나는 OP가 셔플 링 전후의 주어진 카드의 위치를 ​​의미한다고 생각합니다. 예를 들어, 하트 에이스는 이전부터 3 위, 이후 8 위일 수 있습니다.
gung-Monica Monica 복원

"오버 핸드 셔플"이란 위키피디아가 "리플 셔플" 이라고 부르는 것을 의미 합니까?
gung-Monica Monica 복원

1
링크 된 wikipedia 페이지에는 OP가 말한 "riffle shuffle"과 "overhand shuffle"에 대한 항목이 있습니다. 당신이 :) 링크의 링크 읽을 수있는 그것의 좋은
bdeonovic

1
@Pureferret 그럴 경우, 나는 다시 말하겠습니다. 당신은 해야 순위 상관 조치를 계산.
tchakravarty

답변:


14

인접한 모든 카드 쌍 사이의 액면가 차이 의 Shannon 엔트로피 를 사용하여 상대적인 상관 관계 수준 (또는보다 정확하게는 임의성 증가)을 측정 할 수 있습니다 .

무작위로 섞인 52 장의 카드 더미를 계산하는 방법은 다음과 같습니다. 전체 데크를 한 번 반복하고 일종의 히스토그램을 작성하는 것으로 시작합니다. 각 카드 위치나는=1,2,...,52액면가의 차이 계산 Δ에프나는=에프나는+1에프나는. 이를보다 구체적으로하기 위해(나는+1)위치는 스페이드의 왕이며 나는위치는 4 개의 클럽입니다. 그럼 우리는에프나는+1=51에프나는=Δ에프나는=51=48. 당신이 도착하면나는=52특별한 경우입니다. 다시 갑판의 시작 부분으로 돌아와서Δ에프52=에프1에프52. 당신이에 대한 음수로 끝나는 경우Δ에프페이스 값 차이를 1-52 범위로 다시 가져 오려면 52를 추가합니다.

인접한 카드 쌍 52 개에 대해 일련의 액면가 차이가 발생하며 각 카드는 1-52의 허용 범위에 해당합니다. 52 개의 요소가있는 히스토그램 (즉, 1 차원 배열)을 사용하여 이들의 상대 빈도를 계산합니다. 히스토그램은 데크에 대한 일종의 "관측 확률 분포"를 기록합니다. 각 빈의 개수를 52로 나누어이 분포를 정규화 할 수 있습니다. 따라서 일련의 변수가 생깁니다1,2,...52 여기서 히스토그램의 특정 빈에서 무작위로 몇 쌍의 얼굴 값 차이가 무작위로 발생했는지에 따라 각각의 가능한 값의 범위 ({0, 1/52, 2/52, 3/52 등)를 취할 수 있습니다}.

히스토그램이 있으면 특정 셔플 반복에 대한 Shannon 엔트로피를 다음과 같이 계산할 수 있습니다.

이자형=케이=152케이(케이)
결과를 보여주기 위해 R로 작은 시뮬레이션을 작성했습니다. 첫 번째 줄거리는 20 번의 셔플 반복 과정에서 엔트로피가 어떻게 진화하는지 보여줍니다. 값이 0이면 완벽하게 주문 된 데크와 연결됩니다. 큰 값은 점점 더 무질서하거나 장식적인 데크를 의미합니다. 두 번째 줄거리는 일련의 20 개의 패싯을 보여줍니다. 각 패싯에는 원래 질문과 함께 포함 된 것과 유사한 줄거리가 포함되어 있으며, 순서가 뒤섞인 카드 순서와 초기 카드 순서가 표시됩니다. 두 번째 플롯의 20 개의 패싯은 첫 번째 플롯의 20 개의 반복과 동일하며 색상도 동일하게 구분되므로 Shannon 엔트로피 레벨이 어느 정도의 임의성에 해당하는지 시각적으로 느낄 수 있습니다. 정렬 순서 플롯을 생성 한 시뮬레이션 코드가 끝에 추가됩니다.

Shannon 정보 엔트로피 대 셔플 반복

셔플 순서와 시작 순서의 순서는 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 개의 컷 앤 셔플 만 있으면됩니다.

우선, 스타 키라가 Shannon 엔트로피를 계산하기 위해 언급 한 모든 것이 정확합니다. 이런 식으로 끓일 수 있습니다.

  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. 값을 합산

스타 키라가 하나의 미묘한 가정을하는 경우, 컴퓨터 프로그램에서 인간 셔플을 구현하는 데는 약간의 수하물이있을 것입니다. 종이로 된 트럼프 패를 사용하면 손에 묻은 기름이 카드로 옮겨집니다. 오일 축적으로 인해 오랜 시간이 지나면 카드가 서로 붙기 시작하여 셔플로 끝납니다. 데크가 많이 사용 될수록 두 개 이상의 인접한 카드가 서로 붙어서 더 자주 발생합니다.

또한, 두 클럽과 하트 잭이 서로 붙어 있다고 가정합니다. 셔플 링 기간 동안 서로 분리되어 분리되지 않을 수 있습니다. 이것은 컴퓨터 프로그램에서 모방 될 수 있지만, 스타 키라의 R 루틴에서는 그렇지 않습니다.

또한, 스타 키라에는 조작 변수 "mixprob"가 있습니다. 이 변수를 완전히 이해하지 못하면 약간의 블랙 박스입니다. 잘못 설정하여 결과에 영향을 줄 수 있습니다. 그래서 그의 직관이 올바른지 확인하고 싶었습니다. 그래서 손으로 확인했습니다.

나는 두 가지 다른 경우 (총 40 회의 셔플)로 손으로 갑판을 20 회 섞었다. 첫 번째 경우, 나는 오른쪽과 왼쪽 컷을 균일하게 유지하면서 리플을 섞었다. 두 번째 경우, 나는 셔플 셔플을 고르게 절단하기 전에 갑판의 중간 (1/3, 2/5, 1/4 등)에서 의도적으로 갑판을 잘라냅니다. 두 번째 사례에서 내 직감은 셔플 링하기 전에 데크를 자르고 중간에서 멀어지면 리플 셔플 링보다 데크에 빠르게 확산 될 수 있다는 것입니다.

결과는 다음과 같습니다. 첫째, 스트레이트 리플 셔플 링 :

리플 셔플 링이있는 카드 당 엔트로피

다음은 리플 셔플 링과 결합 된 데크를 절단하는 것입니다.

절단 및 리플 셔플 링이있는 카드 당 엔트로피

스타 키라에 의한 주장의 약 1/2 시간에 엔트로피가 최대화되는 것으로 보인다. 또한, 리플 셔플 링이 데크에 더 많이 확산되기 전에 데크를 의도적으로 중간에서 멀어지게 절단하는 직관이 정확했습니다. 그러나 약 5 회의 셔플 후에는 더 이상 중요하지 않습니다. 당신은 약 6-7 셔플 후 엔트로피가 최대화되고, 주장이 내 스타 키라를 만든 10-12에 비해 최대임을 알 수 있습니다. 7 개의 셔플만으로도 충분합니까, 아니면 눈을 멀게합니까?

Google 스프레드 시트에서 내 데이터를 볼 수 있습니다 . 재생 카드를 한두 개 잘못 기록했을 수 있으므로 데이터의 100 % 정확성을 보장 할 수 없습니다.

조사 결과도 독립적으로 확인하는 것이 중요합니다. 하버드 대학교 수학과의 브래드 만 (Brad Mann)은 덱에있는 카드의 예측 가능성을 완전히 예측하기 전에 덱을 섞는 데 몇 번이나 걸리는지 연구했습니다 (샤논 엔트로피가 최대화 됨). 그의 결과는 이 33 페이지 PDF에서 찾을 수 있습니다 .

그의 발견에서 흥미로운 것은, 그는 Persi Diaconis의 1990 New York Times 기사를 실제로 독립적으로 검증 하고 있으며 , 그는 셔플 셔플을 통해 카드 덱을 완전히 혼합하기에 7 개의 셔플이 충분하다고 주장합니다.

Brad Mann은 Markov 체인을 포함하여 셔플 링에서 몇 가지 수학적 모델을 살펴보고 다음과 같은 결론을 얻습니다.

이는 n = 52의 경우 약 11.7이므로이 관점에 따르면 실제 카드 데크를 무작위 화하는 데 평균 11 또는 12 개의 셔플이 필요할 것으로 예상됩니다. 이것은 실질적으로 7보다 큽니다.

브래드만은 스타 키라의 결과를 독립적으로 확인했지만 내 것이 아닙니다. 그래서 나는 내 데이터를 자세히 살펴 보았고 왜 7 개의 셔플이 충분하지 않은지를 발견했습니다. 우선, 데크의 모든 카드에 대한 이론적 인 최대 Shannon 엔트로피는 비트 (log (52) / log (2) ~ = 5.7 비트)입니다. 그러나 내 데이터는 실제로 5 비트 이상을 절대로 나누지 않습니다. 궁금한 점은 파이썬에서 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 비트가됩니다. 이 작업을 수십 번 정도 수행하면 5.2 비트와 4.6 비트 사이에서 비슷한 결과가 나타나며 평균은 4.8 ~ 4.9입니다. 따라서 내 데이터의 원시 엔트로피 값을 보는 것만으로는 충분하지 않습니다. 그렇지 않으면 5 번의 셔플을 잘 수행 할 수 있습니다.

내 데이터를 자세히 살펴보면 "제로 버킷"수가 발견되었습니다. 이들은 해당 번호의 카드 페이스 사이에 델타에 대한 데이터가없는 버킷입니다. 예를 들어, 인접한 두 카드의 값을 빼면 52 개의 델타가 모두 계산 된 후 "15"결과가 없습니다.

나는 그것이 결국 11-12 셔플 주위에 17-18 "제로 버킷"주위에 정착하는 것을 본다. 물론, 파이썬을 통한 셔플 데크는 평균 17-18 "제로 버킷"으로 21이 높고 14가 낮습니다. 17-18이 정착 된 결과 인 이유는 아직 ... 아직 설명 할 수 없습니다. 그러나 ~ 4.8 비트의 엔트로피와 17 개의 "제로 버킷"을 모두 원하는 것으로 보입니다.

내 주식 리플 셔플 링으로 11-12 셔플입니다. 컷 앤 셔플을 사용하면 6-7입니다. 따라서 게임에 관해서는 cut-and-shuffle을 권장합니다. 이렇게하면 상단 및 하단 카드가 각 셔플의 데크에 섞여 있음을 보장 할뿐만 아니라 11-12 셔플보다 평범합니다. 나는 당신에 대해 모른다. 그러나 나는 나의 가족 및 친구들과 카드 게임을 할 때, 나는 12 리플 셔플을 수행하기에 충분히 인내심이 없다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.