Tương quan giữa hai bộ bài?


11

Tôi đã viết một chương trình để mô phỏng việc xáo trộn thẻ quá tay .

Mỗi thẻ được đánh số, với bộ đồ đi từ CLUBS, DIAMONDS, HEARTS, SPADESvà thứ hạng từ Hai đến Mười rồi Jack, Nữ hoàng, Vua và Ace. Do đó, Two of Club có số lượng là 1, Three of Club là 2 .... Ace of Câu lạc bộ là 13 ... Ace of Spades là 52.

Một trong những phương pháp để xác định mức độ xáo trộn của thẻ là so sánh nó với thẻ không bị xáo trộn và xem thứ tự của thẻ có tương quan hay không.

Đó là, tôi có thể có những thẻ này, với thẻ không bị xáo trộn để so sánh:

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

Tương quan theo phương pháp Pearson sẽ là: 0,6

Với một bộ thẻ lớn (tất cả 52), bạn có thể thấy các mẫu xuất hiện. Giả thuyết của tôi là sau khi xáo trộn nhiều hơn, bạn sẽ có ít mối tương quan hơn.

Tuy nhiên, có rất nhiều cách để đo lường mối tương quan.

Tôi đã thử với tương quan của Pearson nhưng tôi không chắc liệu đây có phải là mối tương quan đúng để sử dụng trong tình huống này không.

Đây có phải là một biện pháp tương quan phù hợp? Có một biện pháp phù hợp hơn?

Điểm thưởng Đôi khi tôi thấy loại dữ liệu này trong kết quả của mình:

Mẫu thẻ tương quan

Rõ ràng có một số mối tương quan nhưng tôi không biết làm thế nào bạn đo lường 'đường xu hướng' riêng biệt?


Để giúp chúng tôi hiểu rõ hơn những gì bạn muốn, có lẽ bạn có thể chính xác hơn một chút về ý nghĩa của bạn bởi "thứ tự các thẻ có tương quan."
whuber

@whuber, tôi nghĩ OP có nghĩa là vị trí của một thẻ nhất định trước khi xáo trộn & sau đó. Ví dụ, át chủ bài của trái tim có thể đứng thứ 3 từ đầu trước & thứ 8 sau đó.
gung - Phục hồi Monica

Tôi tự hỏi nếu bằng cách "xáo trộn quá tay", bạn có nghĩa là những gì Wikipedia gọi là "xáo trộn riffle"?
gung - Phục hồi Monica

1
@gung trang wikipedia mà bạn liên kết có các mục cho cả "riffle shuffle" và "overuffle shuffle" mà OP đang nói đến.
Thật

1
@Pureferret Trong trường hợp đó, tôi sẽ viết lại. Bạn nên tính toán các biện pháp tương quan xếp hạng.
tchakravarty

Câu trả lời:


14

Bạn có thể đo mức tương quan tương đối (hay chính xác hơn là mức độ ngẫu nhiên ngày càng tăng) bằng cách sử dụng entropy của Shannon về sự khác biệt về mệnh giá giữa tất cả các cặp thẻ liền kề.

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)
Tôi đã viết một mô phỏng nhỏ trong R để chứng minh kết quả. Cốt truyện đầu tiên cho thấy entropy phát triển như thế nào trong suốt 20 lần lặp ngẫu nhiên. Giá trị 0 được liên kết với một sàn được sắp xếp hoàn hảo; các giá trị lớn hơn biểu thị một cỗ bài đang dần rối loạn hoặc suy đồi. Cốt truyện thứ hai cho thấy một loạt gồm 20 khía cạnh, mỗi khía cạnh chứa một âm mưu tương tự như cốt truyện ban đầu được bao gồm trong câu hỏi, hiển thị thứ tự thẻ được xáo trộn so với thứ tự thẻ ban đầu. 20 khía cạnh trong cốt truyện thứ 2 giống như 20 lần lặp trong cốt truyện thứ nhất và chúng cũng được mã hóa màu giống nhau, để bạn có thể cảm nhận được mức độ của entropy của Shannon tương ứng với mức độ ngẫu nhiên trong thứ tự sắp xếp. Mã mô phỏng tạo ra các ô được thêm vào cuối.

Shannon thông tin entropy so với lặp shuffle

Thứ tự xáo trộn so với thứ tự bắt đầu trong 20 lần xáo trộn, cho thấy các thẻ ngày càng ít tương quan hơn và được phân phối ngẫu nhiên hơn theo thời gian.

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

Tôi biết rằng bài đăng này đã gần 4 năm, nhưng tôi là một nhà phân tích mật mã có sở thích, và đã nghiên cứu về chơi mật mã thẻ . Kết quả là, tôi đã quay lại bài này nhiều lần để giải thích việc xáo trộn bộ bài như là một nguồn entropy cho việc khóa ngẫu nhiên bộ bài. Cuối cùng, tôi quyết định xác minh câu trả lời bằng stachyra bằng cách xáo trộn bộ bài bằng tay và ước tính entropy của bộ bài sau mỗi lần xáo trộn.

TL; DR, để tối đa hóa entropy boong:

  • Để chỉ xáo trộn riffle, bạn cần 11-12 lần xáo trộn.
  • Để cắt boong trước sau đó xáo trộn xáo trộn, bạn chỉ cần 6-7 lần cắt và xáo trộn.

Trước hết, tất cả mọi thứ mà stachyra đề cập để tính toán entropy của Shannon là chính xác. Nó có thể được đun sôi theo cách này:

  1. Số lượng gán một giá trị duy nhất cho mỗi trong số 52 thẻ trong bộ bài.
  2. Xáo trộn bộ bài.
  3. Với n = 0 đến n = 51, ghi lại từng giá trị của (n - (n + 1) mod 52) mod 52
  4. Đếm số lần xuất hiện của 0, 1, 2, ..., 49, 50, 51
  5. Bình thường hóa các hồ sơ bằng cách chia cho 52
  6. Với i = 1 đến i = 52, hãy tính -p_i * log (p_i) / log (2)
  7. Tính tổng các giá trị

Trường hợp stachyra đưa ra một giả định tinh tế, đó là việc thực hiện một sự xáo trộn của con người trong một chương trình máy tính sẽ đi kèm với một số hành lý. Với thẻ chơi trên giấy, khi chúng đã quen, dầu từ tay bạn chuyển sang thẻ. Trong một thời gian dài, do sự tích tụ dầu, các thẻ sẽ bắt đầu dính lại với nhau và điều này sẽ kết thúc trong việc xáo trộn của bạn. Bộ bài được sử dụng càng nhiều, càng có nhiều khả năng hai hoặc nhiều thẻ liền kề sẽ dính vào nhau và điều đó sẽ xảy ra thường xuyên hơn.

Hơn nữa, giả sử hai câu lạc bộ và jack của trái tim gắn bó với nhau. Họ có thể sẽ bị mắc kẹt với nhau trong suốt thời gian xáo trộn của bạn, không bao giờ tách rời. Điều này có thể được bắt chước trong một chương trình máy tính, nhưng đây không phải là trường hợp với thói quen R của stachyra.

Ngoài ra, stachyra có một biến thao tác "mixprob". Không hiểu đầy đủ về biến này, nó là một chút của hộp đen. Bạn có thể đặt sai, ảnh hưởng đến kết quả. Vì vậy, tôi muốn chắc chắn rằng trực giác của anh ấy là chính xác. Vì vậy, tôi đã xác minh nó bằng tay.

Tôi xáo trộn bộ bài 20 lần bằng tay, trong hai trường hợp khác nhau (tổng số 40 lần xáo trộn). Trong trường hợp đầu tiên, tôi chỉ xáo trộn xáo trộn, giữ các vết cắt bên phải và bên trái gần với nhau. Trong trường hợp thứ hai, tôi cố tình cắt boong ra khỏi giữa boong (1/3, 2/5, 1/4, v.v.) trước khi thực hiện cắt thậm chí cho shuffle riffle. Cảm giác ruột của tôi trong trường hợp thứ hai là bằng cách cắt boong trước khi xáo trộn, và tránh xa giữa chừng, tôi có thể đưa khuếch tán vào boong nhanh hơn so với xáo trộn cổ phiếu.

Đây là kết quả. Đầu tiên, riffle xáo trộn thẳng:

Entropy mỗi thẻ với xáo trộn riffle

Và đây là cắt boong kết hợp với xáo trộn riffle:

Entropy mỗi thẻ với cắt và xáo trộn xáo trộn

Có vẻ như entropy được tối đa hóa trong khoảng 1/2 thời gian yêu cầu của stachyra. Hơn nữa, trực giác của tôi là chính xác rằng việc cắt boong cố tình ra khỏi giữa trước, trước khi xáo trộn riffle đã giới thiệu thêm sự khuếch tán vào boong. Tuy nhiên, sau khoảng 5 lần xáo trộn, nó không thực sự quan trọng nữa. Bạn có thể thấy rằng sau khoảng 6-7 lần xáo trộn, entropy được tối đa hóa, so với 10-12 khi yêu cầu thực hiện stachyra của tôi. Có thể là 7 shuffles là đủ, hoặc tôi bị mù?

Bạn có thể xem dữ liệu của tôi tại Google Sheets . Có thể tôi đã ghi lại một hoặc hai thẻ chơi không chính xác, vì vậy tôi không thể đảm bảo chính xác 100% với dữ liệu.

Điều quan trọng là những phát hiện của bạn cũng được xác minh độc lập. Brad Mann, từ Khoa Toán học tại Đại học Harvard, đã nghiên cứu bao nhiêu lần để xáo trộn một cỗ bài trước khi khả năng dự đoán của bất kỳ thẻ nào trong bộ bài là hoàn toàn không thể đoán trước (entropy của Shannon được tối đa hóa). Kết quả của ông có thể được tìm thấy trong bản PDF 33 trang này .

Điều thú vị với phát hiện của anh ta là anh ta thực sự độc lập xác minh một bài báo New York Times năm 1990 của Persi Diaconis , người tuyên bố rằng 7 xáo trộn là đủ để trộn kỹ một cỗ bài chơi thông qua xáo trộn riffle.

Brad Mann đi qua một vài mô hình toán học khác nhau trong xáo trộn, bao gồm chuỗi Markov, và đi đến kết luận sau:

Con số này xấp xỉ 11,7 cho n = 52, điều đó có nghĩa là, theo quan điểm này, chúng tôi hy vọng trung bình 11 hoặc 12 lần xáo trộn là cần thiết để ngẫu nhiên một bộ bài thực sự. Lưu ý rằng điều này là lớn hơn 7.

Brad Mann chỉ xác nhận độc lập kết quả của stachyra chứ không phải của tôi. Vì vậy, tôi đã xem xét kỹ hơn dữ liệu của mình và tôi phát hiện ra tại sao 7 lần xáo trộn là không đủ. Trước hết, entropy tối đa theo lý thuyết Shannon tính theo bit cho bất kỳ thẻ nào trong bộ bài là log (52) / log (2) ~ = 5,7 bit. Nhưng dữ liệu của tôi không bao giờ thực sự phá vỡ nhiều hơn 5 bit. Tò mò, tôi đã tạo ra một mảng gồm 52 phần tử trong Python, xáo trộn mảng đó:

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

Tính toán entropy-per-card của nó mang lại khoảng 4,8 bit. Làm điều này hàng chục lần hoặc lâu hơn cho thấy kết quả tương tự khác nhau giữa 5,2 bit và 4,6 bit, với mức trung bình 4,8 đến 4,9. Vì vậy, nhìn vào giá trị entropy thô của dữ liệu của tôi là không đủ, nếu không tôi có thể gọi nó là tốt với 5 lần xáo trộn.

Khi tôi nhìn kỹ hơn vào dữ liệu của mình, tôi nhận thấy số lượng "số không". Đây là các nhóm không có dữ liệu về vùng đồng bằng giữa các mặt thẻ cho số đó. Ví dụ: khi trừ giá trị của hai thẻ liền kề, không có kết quả "15" sau khi tất cả 52 đồng bằng đã được tính toán.

Tôi thấy rằng cuối cùng nó giải quyết khoảng 17-18 "số không" trong khoảng 11-12 lần xáo trộn. Chắc chắn, bộ bài xáo trộn của tôi thông qua Python trung bình 17-18 "số không", với mức cao là 21 và mức thấp là 14. Tại sao 17-18 là kết quả giải quyết, tôi chưa thể giải thích .... Nhưng, có vẻ như tôi muốn cả ~ 4,8 bit entropy VÀ 17 "số không".

Với sự xáo trộn chứng khoán của tôi, đó là 11-12 lần xáo trộn. Với cut-and-shuffle của tôi, đó là 6-7. Vì vậy, khi nói đến các trò chơi, tôi sẽ khuyên bạn nên cắt và xáo trộn. Điều này không chỉ đảm bảo rằng các thẻ trên và dưới được trộn lẫn vào bộ bài trên mỗi lần xáo trộn, nó cũng chỉ đơn giản là nhanh hơn 11-12 lần xáo trộn. Tôi không biết về bạn, nhưng khi tôi chơi các trò chơi bài với gia đình và bạn bè, họ không đủ kiên nhẫn để tôi thực hiện 12 lần xáo trộn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.