Кореляція між двома колодами карт?


11

Я написав програму для імітації перемикання накладних карт.

Кожна карта пронумерована, з костюмом, що йде від CLUBS, DIAMONDS, HEARTS, SPADESта до двох до десяти, потім Джек, Королева, Кінг та Ейс. Таким чином, два клуби мають число 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

Кореляція методом Пірсона склала б: 0,6

З великим набором карток (всього 52) ви можете побачити візерунки. Моя гіпотеза полягає в тому, що після більшого перетасування ви отримаєте меншу кореляцію.

Однак існує маса способів вимірювання кореляції.

Я спробував свої сили у співвіднесенні Пірсона, але не впевнений, чи це правильне співвідношення для використання в цій ситуації.

Це підходящий захід кореляції? Чи є більш підходящий захід?

Бонусні бали Я іноді бачу такі дані в своїх результатах:

Кореляція зразкової карти

Очевидно, що існує деяка кореляція, але я не знаю, як ви вимірюєте окремі «трендові лінії»?


Щоб допомогти нам краще зрозуміти, чого ви хочете, можливо, ви могли б бути трохи точнішими щодо того, що ви маєте на увазі під "порядком карт карт".
whuber

@whuber, я думаю, що ОП означає положення даної карти перед переміщенням і після. Наприклад, туз сердець, можливо, був попереднім 3-м і згодом 8-м.
gung - Відновити Моніку

Цікаво, якщо ви, маючи на увазі "перекриття", має на увазі те, що Вікіпедія називає "стрілецьким переміщенням"?
gung - Відновіть Моніку

1
@gung на сторінці вікіпедії, на яку ви посилаєтеся, є записи як про "стрілецьке переміщення", так і про "накладне переміщення", про яке говорила ОП. Добре прочитати посилання, на які ви посилаєтесь :)
bdeonovic

1
@Pureferret У такому випадку я перефразую. Вам слід обчислити заходи кореляції рангів.
чакраварти

Відповіді:


14

Можна виміряти відносний рівень кореляції (а точніше - зростаючий рівень випадковості), використовуючи ентропію Шеннона різниці номіналу між усіма парами сусідніх карт.

Ось як це обчислити для випадково перетасованої колоди з 52 карт. Ви починаєте, перебираючи один раз по всій колоді та будуючи своєрідну гістограму. Для кожної позиції карткиi=1,2,...,52, обчисліть різницю номіналу ΔЖi=Жi+1-Жi. Щоб зробити це більш конкретним, скажімо, що картка в(i+1)На цій позиції пік-короля, а карта в iПозиція займає чотири клуби. Тоді маємоЖi+1=51 і Жi=3 і ΔЖi=51-3=48. Коли ви дістанетесь доi=52, це особливий випадок; ти знову петлю навколо початку колоди і берешΔЖ52=Ж1-Ж52. Якщо у вас є негативні цифри для будь-якого зΔЖ's, додайте 52, щоб повернути різницю номіналу в діапазон 1-52.

Ви отримаєте набір різниць за номінальною вартістю для 52 пар сусідніх карт, кожна з яких потрапляє в допустимий діапазон від 1-52; порахуйте відносну частоту їх за допомогою гістограми (тобто одновимірного масиву) з 52 елементами. Гістограма фіксує свого роду "спостережуваний розподіл ймовірностей" для колоди; ви можете нормалізувати цей розподіл, поділивши підрахунки у кожному біні на 52. Таким чином, ви отримаєте ряд зміннихp1,p2,...p52 де кожне може приймати дискретний діапазон можливих значень: {0, 1/52, 2/52, 3/52 та ін.} залежно від того, скільки парних різниць номінальних значень потрапило випадковим чином у конкретний відрізок гістограми.

Щойно у вас є гістограма, ви можете обчислити ентропію Шеннона для конкретної ітерації перетасовки як

Е=к=152-pклн(pк)
Я написав невелике моделювання в R, щоб продемонструвати результат. Перший сюжет показує, як розвивається ентропія протягом 20 ітерацій перетасування. Значення 0 асоціюється з ідеально упорядкованою колодою; більші значення означають колоду, яка прогресивно більш невпорядкована або декоррельована. Другий сюжет показує серію з 20 граней, кожна з яких містить сюжет, аналогічний тому, який був спочатку включений у запитання, показуючи перетасоване замовлення карт у порівнянні з початковим замовленням картки. 20 граней у другому сюжеті такі ж, як 20 ітерацій у першому сюжеті, і вони також кольорово кодовані так само, щоб ви могли візуально відчути, який рівень ентропії Шеннона відповідає кількості випадковості в порядок сортування. Код імітації, який генерував графіки, додається в кінці.

Ентропія інформації Шеннона проти ітерації перетасування

Порядок переміщення та стартовий порядок для 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 відсічок.

По-перше, все, що згадувало Стахира для обчислення ентропії Шеннона, є правильним. Його можна зварити таким чином:

  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-режимі stachyra.

Також stachyra має змінну маніпуляцію "mixprob". Без повного розуміння цієї змінної це трохи чорна скринька. Ви можете його неправильно встановити, що впливає на результати. Отже, я хотів переконатися, що його інтуїція правильна. Тому я перевірив це вручну.

Я переміщав колоду 20 разів вручну, у двох різних випадках (40 загальних перетасовок). По-перше, я просто гвинтівку перемістив, тримаючи правий і лівий надрізи близько до рівних. У другому випадку я нарізаю колоду навмисно від середини колоди (1/3, 2/5, 1/4 тощо), перш ніж робити рівномірний розріз для перестрілки. Моє відчуття кишечника в другому випадку полягало в тому, що, вирізавши колоду перед перетасуванням і тримаючись подалі від середини, я міг би ввести дифузію в палубу швидше, ніж перетасування запасів.

Ось результати. По-перше, пряме переміщення гвинтівки:

Ентропія на одну карту з переміщенням гвинтівки

А ось розрізання настилу в поєднанні з перетасуванням гвинтівки:

Ентропія на одну карту з відсіканням та зрізанням стрілець

Здається, що ентропія максимально збільшується приблизно в 1/2 часу вимоги стахірою. Далі, моя інтуїція була правильною, що нарізування колоди спочатку навмисно віддаляється від середини, перш ніж перетасування стрілецької зброї вводить в палубу більше дифузії. Однак, приблизно через 5 перетасовань, це вже не мало особливого значення. Ви можете бачити, що приблизно через 6-7 перетасовок, ентропія максимальна, порівняно з 10-12, як заява моєї стахіри. Чи можливо, що 7 перетасовань достатньо, або я засліплений?

Мої дані ви можете побачити на Google Таблицях . Цілком можливо, що я записав гральну карту або дві неправильно, тому не можу гарантувати 100% точність даних.

Важливо, щоб ваші висновки також були незалежно підтверджені. Бред Манн з кафедри математики Гарвардського університету вивчав, скільки разів знадобиться перетасувати колоду карт, перш ніж передбачуваність будь-якої карти в колоді буде абсолютно непередбачуваною (ентропія Шеннона максимальна). Його результати можна знайти в цьому 33-сторінковому PDF .

Що цікаво з його висновків, це те, що він насправді незалежно перевіряє статтю «Нью-Йорк Таймс» 1990 року Персі Діаконіса , який стверджує, що 7 перетасовань достатньо для ретельного перемішування колоди ігрових карт через перестрілку.

Бред Манн перебирає декілька різних математичних моделей у перетасуванні, включаючи ланцюги Маркова, і приходить до такого висновку:

Це приблизно 11,7 для n = 52, що означає, що відповідно до цієї точки зору, ми очікуємо, що в середньому 11 або 12 перетасовок буде необхідним для рандомізації реальної колоди карт. Зауважте, що це значно більше 7.

Бред Манн просто незалежно підтвердив результат стахіри, а не мій. Отже, я придивився уважніше до своїх даних і виявив, чому 7 перетасовань недостатньо. По-перше, теоретична максимальна ентропія Шеннона в бітах для будь-якої карти в колоді - це log (52) / log (2) ~ = 5,7 біт. Але мої дані ніколи насправді не перевищують більше 5 біт. Цікаво, що я створив масив із 52 елементів у Python, перетасував цей масив:

>>> 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 перетасовок.

Коли я придивився уважніше до своїх даних, то помітив кількість «нульових відра». Це відра, у яких немає даних про дельти між обличчями карт для цієї кількості. Наприклад, при відніманні значення двох сусідніх карт немає результату "15" після того, як було обчислено всі 52 дельта.

Я бачу, що вона врешті-решт осідає приблизно 17-18 "нульових відра" біля 11-12 перетасовок. Звичайно, моя перетасована колода через Python в середньому становить 17-18 "нульових відра", з високою 21 і низькою 14. Чому 17-18 - це врегульований результат, я не можу пояснити ... поки. Але, схоже, мені хочеться ~ 4,8 біта ентропії І 17 "нульових відра".

З моєї біржової стрілецької стрілки - це 11-12 перетасовок. З моїм відсіканням, це 6-7. Тож, якщо мова йде про ігри, я б рекомендував «відсікати». Це не тільки гарантує, що верхня та нижня карти змішуються в колоду на кожному перетасуванні, це також просто швидше, ніж 11-12 перетасовань. Я не знаю про вас, але коли я граю в карткові ігри зі своєю родиною та друзями, вони недостатньо терплячі для мене, щоб виконати 12 перестрілок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.