Hay una respuesta exacta (en forma de un producto matricial, presentado en el punto 4 a continuación). Existe un algoritmo razonablemente eficiente para calcularlo, derivado de estas observaciones:
Se puede generar una combinación aleatoria de cartas barajando aleatoriamente tarjetas y luego intercalando aleatoriamente las cartas restantes dentro de ellas.N kN+kNk
Al mezclar solo los ases, y luego (aplicando la primera observación) intercalando los dos, luego los tres, etc., este problema puede verse como una cadena de trece pasos.
Necesitamos hacer un seguimiento de más del valor de la tarjeta que estamos buscando. Sin embargo, al hacer esto, no necesitamos tener en cuenta la posición de la marca en relación con todas las cartas, sino solo su posición en relación con las cartas de igual o menor valor.
Imagina colocar una marca en el primer as, y luego marcar los dos primeros encontrados después, y así sucesivamente. (Si en algún momento el mazo se agota sin mostrar la carta que estamos buscando actualmente, dejaremos todas las cartas sin marcar). Deje que el "lugar" de cada marca (cuando exista) sea el número de cartas de igual o menor valor que se repartieron cuando se realizó la marca (incluida la propia tarjeta marcada). Los lugares contienen toda la información esencial.
El lugar después de la marca es un número aleatorio. Para un mazo dado, la secuencia de estos lugares forma un proceso estocástico. De hecho, es un proceso de Markov (con matriz de transición variable). Por lo tanto, se puede calcular una respuesta exacta a partir de doce multiplicaciones matriciales.ith
Usando estas ideas, esta máquina obtiene un valor de (computación en coma flotante de doble precisión) en segundo. Esta aproximación del valor exacto es precisa para todos los dígitos mostrados.1 / 9 19826005792658947850269453319689390235225425695.83258855290199651/9
1982600579265894785026945331968939023522542569339917784579447928182134345929899510000000000
El resto de esta publicación proporciona detalles, presenta una implementación funcional (en R
) y concluye con algunos comentarios sobre la pregunta y la eficiencia de la solución.
Generación aleatoria de barajas
En realidad, es más claro conceptualmente y matemáticamente no más complicado considerar un "mazo" (también conocido como multiset ) de cartas de las cuales hay de la denominación más baja, de la siguiente más baja, y así sucesivamente . (La pregunta formulada se refiere al mazo determinado por el vector .N=k1+k2+⋯+kmk1k213(4,4,…,4)
¡Una "combinación aleatoria" de cartas es una permutación tomada uniforme y aleatoriamente de la permutaciones de las cartas. Estas mezclas se agrupan en grupos de configuraciones equivalentes porque permutar los "ases" entre ellos no cambia nada, permutar los "dos" entre ellos tampoco cambia nada, y así sucesivamente. Por lo tanto, cada grupo de permutaciones que se ven idénticas cuando se ignoran los palos de las cartas contienepermutaciones Estos grupos, cuyo número viene dado por el coeficiente multinomialNN!=N×(N−1)×⋯×2×1Nk1k2k1!×k2!×⋯×km!
(Nk1,k2,…,km)=N!k1!k2!⋯km!,
se llaman "combinaciones" de la baraja.
Hay otra forma de contar las combinaciones. ¡Las primeras cartas solo pueden formar combinación. Dejan "espacios" entre y alrededor de ellos en los que se pueden colocar las siguientes cartas. Podríamos indicar esto con un diagrama donde " " designa una de las tarjetas y " " designa una ranura que puede contener entre y tarjetas adicionales:k1k1!/k1!=1k1+1k2∗k1_0k2
_∗_∗_⋯_∗_k1 stars
Cuando se tarjetas adicionales, el patrón de estrellas y nuevas tarjetas divide las tarjetas en dos subconjuntos. El número de subconjuntos distintos es .k2k1+k2(k1+k2k1,k2)=(k1+k2)!k1!k2!
Repitiendo este procedimiento con "tres", encontramos que hay formas de intercalarlos entre las primeras cartas. Por lo tanto, el número total de formas distintas de organizar las primeras tarjetas de esta manera es igualk3((k1+k2)+k3k1+k2,k3)=(k1+k2+k3)!(k1+k2)!k3!k1+k2k1+k2+k3
1×(k1+k2)!k1!k2!×(k1+k2+k3)!(k1+k2)!k3!=(k1+k2+k3)!k1!k2!k3!.
Después de terminar las últimas cartas y continuar multiplicando estas fracciones telescópicas, encontramos que el número de combinaciones distintas obtenidas es igual al número total de combinaciones contadas previamente, . Por lo tanto, no hemos pasado por alto ninguna combinación. Eso significa que este proceso secuencial de barajar las cartas captura correctamente las probabilidades de cada combinación, suponiendo que en cada etapa cada forma distinta posible de intercalar las nuevas cartas entre las viejas se tome con una probabilidad uniformemente igual.kn(Nk1,k2,…,km)
El proceso del lugar
Inicialmente, hay ases y obviamente el primero está marcado. En etapas posteriores hay tarjetas, el lugar (si existe una tarjeta marcada) es igual a (algún valor de a ), y estamos a punto de intercalar cartas a su alrededor. Podemos visualizar esto con un diagrama comok1n=k1+k2+⋯+kj−1p1nk=kj
_∗_∗_⋯_∗_p−1 stars⊙_∗_⋯_∗_n−p stars
donde " " designa el símbolo marcado actualmente. Condicional a este valor del lugar , deseamos encontrar la probabilidad de que el próximo lugar sea igual a (algún valor de a ; según las reglas del juego, el siguiente lugar debe venir después de , de donde ). Si podemos encontrar cuántas formas hay de intercalar las nuevas tarjetas en los espacios en blanco para que el siguiente lugar sea igual a , entonces podemos dividir por el número total de formas de intercalar estas cartas (igual a , como hemos visto) para obtener el⊙pq1n+kpq≥p+1kq(n+kk)probabilidad de transición de que el lugar cambie de a . (También habrá una probabilidad de transición para que el lugar desaparezca por completo cuando ninguna de las nuevas cartas siga a la carta marcada, pero no hay necesidad de calcular esto explícitamente).pq
Actualicemos el diagrama para reflejar esta situación:
_∗_∗_⋯_∗_p−1 stars⊙∗∗⋯∗s stars | _∗_⋯_∗_n−p−s stars
La barra vertical " " muestra dónde aparece la primera carta nueva después de la carta marcada: por lo tanto, no pueden aparecer cartas nuevas entre el y el (y, por lo tanto, no se muestran espacios en ese intervalo). No sabemos cuántas estrellas hay en este intervalo, así que lo acabo de llamar (que puede ser cero). Lo desconocido desaparecerá una vez que encontremos la relación entre él y .|⊙|ssq
Supongamos, entonces, que intercalamos nuevas cartas alrededor de las estrellas antes del y luego, independientemente de eso, intercalamos las nuevas cartas restantes alrededor de las estrellas después del . Existenj⊙k−j−1|
τn,k(s,p)=((p−1)+jj)((n−p−s)+(k−j)−1k−j−1)
maneras de hacer esto. Tenga en cuenta, sin embargo, esta es la parte más complicada del análisis, que el lugar de es igual a porque|p+s+j+1
- Hay "viejas" tarjetas en o antes de la marca.p
- Hay tarjetas antiguas después de la marca pero antes de .s|
- Hay cartas nuevas antes de la marca.j
- Existe la nueva tarjeta representada por misma.|
Por lo tanto, nos da información sobre la transición del lugar al lugar . Cuando rastreamos esta información cuidadosamente para todos los valores posibles de , y sumamos todas estas posibilidades (disjuntas), obtenemos la probabilidad condicional del lugar después del lugar ,τn,k(s,p)pq=p+s+j+1sqp
Prn,k(q|p)=(∑j(p−1+jj)(n+k−qk−j−1))/(n+kk)
donde la suma comienza en y termina en . (La longitud variable de esta suma sugiere que hay es poco probable que sea una fórmula cerrada en función de y , excepto en casos especiales).j=max(0,q−(n+1))j=min(k−1,q−(p+1)n,k,q,p
El algoritmo
Inicialmente, existe la probabilidad que el lugar sea y la probabilidad que tenga cualquier otro valor posible en . Esto puede ser representado por un vector .1102,3,…,k1p1=(1,0,…,0)
Después de intercalar las siguientes tarjetas , el vector se actualiza a multiplicándolo (a la izquierda) por la matriz de transición . Esto se repite hasta que se hayan colocado tarjetas . En cada etapa , la suma de las entradas en el vector de probabilidad es la posibilidad de que se haya marcado alguna tarjeta. Lo que quede para hacer que el valor sea igual a por lo tanto, existe la posibilidad de que no quede ninguna tarjeta marcada después del pasok2p1p2(Prk1,k2(q|p),1≤p≤k1,1≤q≤k2)k1+k2+⋯+kmjpj1j. Por lo tanto, las diferencias sucesivas en estos valores nos dan la probabilidad de que no podamos encontrar una carta de tipo para marcar: esa es la distribución de probabilidad del valor de la carta que estábamos buscando cuando el mazo se agota al final del juego .j
Implementación
El siguiente R
código implementa el algoritmo. Es paralela a la discusión anterior. Primero, el cálculo de las probabilidades de transición se realiza mediante t.matrix
(sin normalización con la división por , lo que facilita el seguimiento de los cálculos al probar el código):(n+kk)
t.matrix <- function(q, p, n, k) {
j <- max(0, q-(n+1)):min(k-1, q-(p+1))
return (sum(choose(p-1+j,j) * choose(n+k-q, k-1-j))
}
Esto lo utiliza transition
para actualizar a . Calcula la matriz de transición y realiza la multiplicación. También se encarga de calcular el vector inicial si el argumento es un vector vacío:pj−1pjp1p
#
# `p` is the place distribution: p[i] is the chance the place is `i`.
#
transition <- function(p, k) {
n <- length(p)
if (n==0) {
q <- c(1, rep(0, k-1))
} else {
#
# Construct the transition matrix.
#
t.mat <- matrix(0, nrow=n, ncol=(n+k))
#dimnames(t.mat) <- list(p=1:n, q=1:(n+k))
for (i in 1:n) {
t.mat[i, ] <- c(rep(0, i), sapply((i+1):(n+k),
function(q) t.matrix(q, i, n, k)))
}
#
# Normalize and apply the transition matrix.
#
q <- as.vector(p %*% t.mat / choose(n+k, k))
}
names(q) <- 1:(n+k)
return (q)
}
Ahora podemos calcular fácilmente las probabilidades sin marca en cada etapa para cualquier mazo:
#
# `k` is an array giving the numbers of each card in order;
# e.g., k = rep(4, 13) for a standard deck.
#
# NB: the *complements* of the p-vectors are output.
#
game <- function(k) {
p <- numeric(0)
q <- sapply(k, function(i) 1 - sum(p <<- transition(p, i)))
names(q) <- names(k)
return (q)
}
Aquí están para el mazo estándar:
k <- rep(4, 13)
names(k) <- c("A", 2:9, "T", "J", "Q", "K")
(g <- game(k))
La salida es
A 2 3 4 5 6 7 8 9 T J Q K
0.00000000 0.01428571 0.09232323 0.25595013 0.46786622 0.66819134 0.81821790 0.91160622 0.96146102 0.98479430 0.99452614 0.99818922 0.99944610
Según las reglas, si se marcara un rey, no buscaríamos más cartas: esto significa que el valor de debe aumentarse a . Al hacerlo, las diferencias dan la distribución del "número en el que se encontrará cuando se acabe el mazo":0.99944611
> g[13] <- 1; diff(g)
2 3 4 5 6 7 8 9 T J Q K
0.014285714 0.078037518 0.163626897 0.211916093 0.200325120 0.150026562 0.093388313 0.049854807 0.023333275 0.009731843 0.003663077 0.001810781
(Compare esto con el resultado que informo en una respuesta separada que describe una simulación de Monte-Carlo: parecen ser los mismos, hasta las cantidades esperadas de variación aleatoria).
El valor esperado es inmediato:
> sum(diff(g) * 2:13)
[1] 5.832589
En total, esto requirió solo una docena de líneas de código ejecutable. Lo he comparado con cálculos manuales para valores pequeños de (hasta ). Por lo tanto, si se observa alguna discrepancia entre el código y el análisis anterior del problema, confíe en el código (porque el análisis puede tener errores tipográficos).k3
Observaciones
Relaciones con otras secuencias.
Cuando hay una de cada tarjeta, la distribución es una secuencia de recíprocos de números enteros:
> 1/diff(game(rep(1,10)))
[1] 2 3 8 30 144 840 5760 45360 403200
El valor en el lugar es(comenzando en el lugar ). Esta es la secuencia A001048 en la Enciclopedia en línea de secuencias enteras . En consecuencia, podríamos esperar una fórmula cerrada para los mazos con constante (los mazos "adecuados") que generalizaría esta secuencia, que tiene algunos significados profundos. (Por ejemplo, cuenta los tamaños de las clases de conjugación más grandes en los grupos de permutación y también está relacionado con los coeficientes trinomiales ). (Desafortunadamente, los recíprocos en la generalización para no suelen ser enteros).ii!+(i−1)!i=1kik>1
El juego como proceso estocástico
Nuestro análisis deja en claro que los coeficientes iniciales de los vectores , , son constantes. Por ejemplo, rastreemos la salida de mientras procesa cada grupo de tarjetas:ipjj≥igame
> sapply(1:13, function(i) game(rep(4,i)))
[[1]]
[1] 0
[[2]]
[1] 0.00000000 0.01428571
[[3]]
[1] 0.00000000 0.01428571 0.09232323
[[4]]
[1] 0.00000000 0.01428571 0.09232323 0.25595013
...
[[13]]
[1] 0.00000000 0.01428571 0.09232323 0.25595013 0.46786622 0.66819134 0.81821790 0.91160622 0.96146102 0.98479430 0.99452614 0.99818922 0.99944610
Por ejemplo, el segundo valor del vector final (que describe los resultados con un mazo completo de 52 cartas) ya apareció después de que se procesó el segundo grupo (y es igual a ). Por lo tanto, si desea información solo sobre las marcas a través del valor de la tarjeta , solo tiene que realizar el cálculo para un mazo de cartas .1/(84)=1/70jthk1+k2+⋯+kj
Debido a que la posibilidad de no marcar una carta de valor se acerca rápidamente a medida que aumenta, después de tipos de cartas en cuatro palos casi hemos alcanzado un valor límite para la expectativa. De hecho, el valor límite es de aproximadamente (calculado para un mazo de cartas, en cuyo punto el error de redondeo de doble precisión evita ir más allá).j1j135.8333554×32
Sincronización
Al observar el algoritmo aplicado al vector , vemos que su sincronización debe ser proporcional a y, usando un límite superior bruto, no es peor que proporcional a . Por temporización todos los cálculos para a través de y a través de , y el análisis de solamente aquellos que toman tiempos relativamente largos ( segundo o más), calculo el tiempo de cálculo es de aproximadamente , apoyando esta evaluación de límite superior.( k , k , ... , k ) k 2 m 3 k = 1 7 n = 10 30 1 / 2 O ( k 2 n 2.9 )m(k,k,…,k)k2m3k=17n=10301/2O(k2n2.9)
Un uso de estas asintóticas es proyectar tiempos de cálculo para problemas mayores. Por ejemplo, viendo que el caso toma aproximadamente segundos, estimaríamos que el caso (muy interesante) tomaría aproximadamente segundos. (En realidad, toma segundos).1,31 k = 1 , n = 100 1,31 ( 1 / 4 ) 2 ( 100 / 30 ) 2,9 ≈ 2,7 2,87k=4,n=301.31k=1,n=1001.31(1/4)2(100/30)2.9≈2.72.87