Соотношение двух колод карт?


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, я думаю, что OP означает положение данной карты до перетасовки и после. Например, туз червей мог быть третьим сверху и восьмым впоследствии.
gung - Восстановить Монику

Интересно, под словом «overhand shuffle» вы имеете в виду то, что Википедия называет «риффл шаффл»?
gung - Восстановить Монику

1
@ на странице википедии, на которую вы ссылались, есть записи как для «riffle shuffle», так и для «overhand shuffle», о котором говорил OP. Хорошо читать ссылки, на которые вы
ссылаетесь

1
@Pureferret В этом случае я перефразирую. Вы должны вычислять меры корреляции ранга.
Чакраварти

Ответы:


14

Вы можете измерить относительный уровень корреляции (или, точнее, возрастающий уровень случайности), используя энтропию Шеннона разности номиналов между всеми парами смежных карт.

Вот как это вычислить, для случайно перемешанной колоды из 52 карт. Вы начинаете с циклического прохождения всей колоды и построения своего рода гистограммы. Для каждой позиции карты рассчитайте разницу в номинале . Чтобы сделать это более конкретно, допустим, что карта в -й позиции - это король пиков, а карта в й позиции - это четверка треф. Тогда мы имеем и и . Когда вы добираетесь до , это особый случай; Вы снова возвращаетесь к началу колоды и беретеязнак равно1,2,,,,,52ΔFязнак равноFя+1-Fя(я+1)яFя+1знак равно51Fязнак равно3ΔFязнак равно51-3знак равно48язнак равно52ΔF52знак равноF1-F52, Если в результате вы получите отрицательные числа для любого из , добавьте 52, чтобы вернуть разницу номиналов в диапазон 1-52.ΔF

В итоге вы получите набор различий по номиналу для 52 пар смежных карт, каждая из которых попадает в допустимый диапазон от 1 до 52; посчитайте их относительную частоту, используя гистограмму (то есть одномерный массив) с 52 элементами. Гистограмма записывает своего рода «наблюдаемое распределение вероятностей» для колоды; Вы можете нормализовать это распределение, разделив счетчики в каждом бине на 52. Таким образом, вы получите последовательность переменных где каждая из них может принимать дискретное значение диапазон возможных значений: {0, 1/52, 2/52, 3/52 и т. д.} в зависимости от того, сколько парных разностей номинальной стоимости случайно попало в конкретную ячейку гистограммы.п1,п2,,,,п52

Получив гистограмму, вы можете рассчитать энтропию Шеннона для конкретной итерации в случайном порядке как

Езнак равноΣКзнак равно152-пКLN(пК)
Я написал небольшое моделирование в R, чтобы продемонстрировать результат. На первом графике показано, как энтропия эволюционирует в течение 20 случайных итераций. Значение 0 связано с идеально упорядоченной колодой; большие значения означают колоду, которая постепенно становится более беспорядочной или декоррелированной. На втором графике показана серия из 20 граней, каждая из которых содержит график, аналогичный графику, который был первоначально включен в вопрос, с указанием порядка перемешанных карт по сравнению с начальным порядком карт. 20 граней на 2-м графике такие же, как и 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 года, но я хобби-криптоаналитик и изучаю шифры игральных карт . В результате я возвращался к этому посту снова и снова, чтобы объяснить перетасовку колоды как источник энтропии для случайного нажатия на колоду. Наконец, я решил проверить ответ с помощью stachyra, перетасовывая колоду вручную и оценивая энтропию колоды после каждого перемешивания.

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 и т. Д.), Прежде чем сделать равномерный разрез для перемешивания. Во втором случае у меня было ощущение, что, обрезая колоду перед перетасовкой и избегая середины, я мог быстрее вводить диффузию в колоду, чем обычная перетасовка.

Вот результаты. Сначала прямолинейное перетасовывание:

Энтропия за карту с риффл тасовкой

А вот рубка колоды в сочетании с перетасовкой:

Энтропия на карту с разрезанием и перетасовкой

Похоже, что энтропия максимизируется примерно за половину времени претензии стачиры. Кроме того, моя интуиция была верна, что обрезание колоды преднамеренно было удалено от середины, прежде чем перетасовка риффла действительно привнесла больше диффузии в колоду. Однако после примерно 5 перемешиваний это уже не имело большого значения. Вы можете видеть, что после примерно 6-7 перемешиваний энтропия увеличивается до 10-12, как утверждают мои стачиры. Может ли быть достаточно, что 7 shuffles достаточно, или я ослеп?

Вы можете увидеть мои данные на Google Sheets . Возможно, я записал одну или две игральные карты неправильно, поэтому я не могу гарантировать 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.