Las estadísticas detrás del ‘Card Strike’ de 888 Poker
Las estadísticas detrás del ‘Card Strike’ de 888 Poker
por Joseph Brennan
Este cuaderno es una traducción al español del artículo de la Comunidad Wolfram “The statistics behind 888 Poker's 'Card Strike'” producido con ayuda de un LLM y verificado por un traductor profesional
Introducción
Introducción
Hace algunos años, me encontré con una característica promocional dentro de la aplicación 888 Poker. Se llamaba Card Strike, y era esencialmente un ‘minijuego’ que se jugaba simultáneamente con las partidas de dinero real. Las reglas se describen en este breve y ostentoso video, así como en este sitio web, pero también las colocaré aquí.
◼
Al ‘tomar asiento’ en una mesa ordinaria de dinero real o en una mesa SNAP, aparecen 16 cartas aleatorias en la parte superior de la pantalla. Me referiré a estas cartas como cartas objetivo.
◼
SNAP poker es un formato rápido en el cual uno es asignado a una nueva mesa y se le reparte una nueva mano tan pronto como se retire.
◼
Una vez que a uno se le reparten sus ‘cartas ocultas’, estas se comparan con las cartas objetivo y, si alguna coincide, entonces la o las cartas objetivo correspondientes quedan ‘eliminadas’.
◼
También hay un límite de mano que muestra el número de manos restantes para que uno pueda ‘golpear’ todas las cartas objetivo.
◼
Uno puede restablecer sus cartas objetivo y el límite de cartas en mano, comenzando de nuevo, después de que se hayan jugado diez manos.
◼
Si tiene éxito, se le da la oportunidad de girar una ruleta por un premio en efectivo aleatorio determinado por las apuestas del juego de dinero real. Parece que el premio máximo es de $10,000; sin embargo, es probable que esto sea en un juego de dinero real de ‘altas apuestas’.
Simple enough! What’s more is that it is completely free, and requires no skill. You are at the probabilistic whims of the cards you are dealt.
¡Es muy simple! Además, es completamente gratis y no requiere ninguna habilidad. Usted está a merced de los caprichos probabilísticos de las cartas que le reparten.
Pensé que esto presentaba una buena oportunidad para explorar las estadísticas de este juego y quizás descubrir algunos resultados interesantes.
Descargo de responsabilidad
Descargo de responsabilidad
Apostar implica un riesgo financiero y puede ser adictivo. El contenido de este artículo se proporciona únicamente con fines educativos y analíticos, y no debe interpretarse como un incentivo para apostar. Juegue siempre de manera responsable, establezca límites claros y busque ayuda si cree que puede tener un problema con el juego. Para recibir asesoramiento y apoyo confidenciales en el Reino Unido, póngase en contacto con GamCare en gamcare.org.uk o llame al 0808 8020 133.
Una mano a la vez
Una mano a la vez
Comenzaré explorando las probabilidades de todos los posibles eventos relacionados con Card Strike para una mano dada de Texas Hold ‘em (también disponible para Pot Limit Omaha, el cual no abordaré aquí).
En cada mano, uno recibe 2 cartas ocultas distintas de una baraja de 52 cartas. Por lo tanto, podría obtener 2, 1 o 0 cartas objetivo. Escribiré funciones para cada caso, asumiendo k cartas objetivo. Según tengo entendido, inicialmente, k es igual a 16.
In[]:=
Clear[p0,p1,p2];p0[k_]:=;p2[k_]:=Ifk>=2,,0;p1[k_]:=1-p0[k]-p2[k];
Binomial[52-k,2]
Binomial[52,2]
Binomial[k,2]
Binomial[52,2]
Matriz de transición
Matriz de transición
Podemos considerar la cantidad de cartas objetivo restantes como nuestro ‘estado’. La probabilidad de pasar al siguiente ‘estado’ depende únicamente del ‘estado’ actual y no del historial de cómo llegamos allí. Esta configuración se presta a una matriz de transición de Markov.
Curiosamente, las cadenas de Markov tienen vínculos históricos con procesos como el barajado de cartas. Mi objetivo es mostrar cómo estas herramientas y técnicas matemáticas no son tan intimidantes, especialmente si puede aprovechar la potencia de Wolfram Language.
Curiosamente, las cadenas de Markov tienen vínculos históricos con procesos como el barajado de cartas. Mi objetivo es mostrar cómo estas herramientas y técnicas matemáticas no son tan intimidantes, especialmente si puede aprovechar la potencia de Wolfram Language.
Para 16 cartas objetivo, hay 17 posibles estados discretos (k = 16 hasta k = 0). Cada vez que juega una mano, existe cierta probabilidad de que se transicione a un nuevo estado en el que k se ha reducido en 2, 1, o se ha mantenido igual.
Es útil reformular esto en términos del número de cartas realmente golpeadas (ψ = 16 - k), que puede variar desde ψ = 0 hasta ψ = 16, ya que esto nos permite ‘comenzar’ en la esquina superior izquierda de nuestra matriz y avanzar hacia abajo y hacia la derecha a medida que llegamos al final.
Al configurar nuestra matriz de transición P, utilizaremos las siguientes reglas:
Es útil reformular esto en términos del número de cartas realmente golpeadas (ψ = 16 - k), que puede variar desde ψ = 0 hasta ψ = 16, ya que esto nos permite ‘comenzar’ en la esquina superior izquierda de nuestra matriz y avanzar hacia abajo y hacia la derecha a medida que llegamos al final.
Al configurar nuestra matriz de transición P, utilizaremos las siguientes reglas:
◼
El elemento representa la probabilidad de no acertar ninguna carta objetivo. Por ejemplo, (1ª fila, 1ª columna) representa la probabilidad de que ψ permanezca en 0.
P
ψ,ψ
ψ
00
◼
El elemento representa la probabilidad de acertar exactamente 1 carta objetivo. Por ejemplo, (1ª fila, 2ª columna) representa la probabilidad de que ψ pase de 0 a 1.
P
ψ,ψ+1
ψ
01
◼
El elemento representa la probabilidad de acertar 2 cartas objetivo. Por ejemplo, (1ª fila, 3ª columna) representa la probabilidad de que ψ pase de 0 a 2.
P
ψ,ψ+2
ψ
02
◼
Todas las demás entradas son 0, ya que no se pueden tachar más de 2 cartas por mano, ni ‘desgolpear’ cartas objetivo.
Crearé esta matriz con ayuda de SparseArray y Band, definiendo como el número inicial de cartas objetivo.
k
0
In[]:=
k0=16;P=SparseArray[{Band[{1,1}]->Table[p0[k0-ψ],{ψ,0,k0}],Band[{1,2}]->Table[p1[k0-ψ],{ψ,0,k0-1}],Band[{1,3}]->Table[p2[k0-ψ],{ψ,0,k0-2}]},{k0+1,k0+1}];MatrixForm[P]
Out[]//MatrixForm=
105 221 | 96 221 | 20 221 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 111 221 | 185 442 | 35 442 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 703 1326 | 266 663 | 7 102 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 19 34 | 13 34 | 1 17 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 10 17 | 80 221 | 11 221 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 410 663 | 451 1326 | 55 1326 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 287 442 | 70 221 | 15 442 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 301 442 | 129 442 | 6 221 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 473 663 | 176 663 | 14 663 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 165 221 | 105 442 | 7 442 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 345 442 | 46 221 | 5 442 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1081 1326 | 235 1326 | 5 663 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 188 221 | 32 221 | 1 221 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 196 221 | 49 442 | 1 442 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1225 1326 | 50 663 | 1 1326 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 25 26 | 1 26 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Esta matriz es 'triangular superior' ya que ψ solo puede permanecer igual o aumentar. El elemento en la esquina inferior derecha es 1 porque tenemos la garantía de no extraer más cartas si todas las cartas han sido extraídas.
Podemos comparar algunas de las filas de esta matriz con los siguientes cálculos utilizando nuestras funciones p0, p1 y p2 definidas anteriormente. Recuerde que la entrada para estas funciones es el número de cartas objetivo restantes:
Podemos comparar algunas de las filas de esta matriz con los siguientes cálculos utilizando nuestras funciones p0, p1 y p2 definidas anteriormente. Recuerde que la entrada para estas funciones es el número de cartas objetivo restantes:
In[]:=
Column[Map[#->Through[{p0,p1,p2}[#]]&,{16,15,10,2}]]
Out[]=
16 105 221 96 221 20 221 |
15 111 221 185 442 35 442 |
10 287 442 70 221 15 442 |
2 1225 1326 50 663 1 1326 |
Una forma agradable de visualizar esta matriz es utilizando WeightedAdjacencyGraph, reemplazando los valores cero por peso infinito:
In[]:=
WeightedAdjacencyGraph[Normal[P]/.{0->Infinity},VertexLabels->Automatic]
Out[]=
Evolución de la matriz de transición
Evolución de la matriz de transición
Recuerde que esta matriz representa las probabilidades de que se golpeen j cartas objetivo, donde j es el índice de columna, después de exactamente dos manos, dado que comenzó con i cartas objetivo golpeadas (donde i es el índice de fila).
Ya tenemos casos en los que podría haber múltiples formas de pasar del estado i al estado j en dos pasos, en cuyo caso se suman las probabilidades de cada forma.
Ya tenemos casos en los que podría haber múltiples formas de pasar del estado i al estado j en dos pasos, en cuyo caso se suman las probabilidades de cada forma.
Además, podríamos observar el elemento en la primera fila y tercera columna, que representa la probabilidad de pasar de ψ = 0 a ψ = 2 en dos manos. Esto podría ocurrir mediante tres pares distintos de eventos independientes: dos y luego cero, cero y luego dos, uno y luego uno.
Ya tiene la idea. Ahora podemos usar esta propiedad de la ‘evolución mediante multiplicación de matrices’ para generar las probabilidades de transición después de cualquier número de manos.
Me gustaría mostrar la matriz de probabilidades de transición después de ocho manos, por una razón que quizás pueda adivinar.
Me gustaría mostrar la matriz de probabilidades de transición después de ocho manos, por una razón que quizás pueda adivinar.
Este es el número mínimo de manos en las que, en principio, podríamos, teóricamente, acertar todas las cartas objetivo. Como puede ver, es increíblemente pequeño, aproximadamente 836,000 veces menos probable que ganar el premio mayor de EuroMillions (cuando este artículo fue escrito).
A continuación muestro cómo podríamos obtener el mismo valor numérico mediante ‘aciertos’ sucesivos de dos cartas objetivo:
A continuación muestro cómo podríamos obtener el mismo valor numérico mediante ‘aciertos’ sucesivos de dos cartas objetivo:
Podemos representar las probabilidades de acertar cada número (de 0 a 16) de cartas objetivo a medida que aumentamos la cantidad de manos jugadas de 5 a 100.
Observe cómo la distribución se desplaza hacia la derecha.
El límite de cartas en mano, antes de que las cartas objetivo se reinicien y deba comenzar de nuevo, suele citarse como 45. Prestemos mucha atención a esta representación para manos entre 40 y 60:
El límite de cartas en mano, antes de que las cartas objetivo se reinicien y deba comenzar de nuevo, suele citarse como 45. Prestemos mucha atención a esta representación para manos entre 40 y 60:
Podemos observar que la probabilidad alcanza su máximo en 13, luego en 14, y después en 15 cartas objetivo, a medida que se juegan 40, 50 y posteriormente 60 manos. Esto evidencia que el límite de 45 manos se elige de manera muy estratégica, de modo que estar cerca de acertar todas las cartas objetivo es el resultado más probable.
A continuación se muestra una representación gráfica de la probabilidad de acertar todas las 16 cartas objetivo en función del número de manos jugadas:
A continuación se muestra una representación gráfica de la probabilidad de acertar todas las 16 cartas objetivo en función del número de manos jugadas:
It looks like there is approximately a 4% chance of success with a 45-hand limit.
Proceso de Markov
Proceso de Markov
Como se mencionó anteriormente, este proceso tiene una propiedad de ‘ausencia de memoria’ con estados discretos ψ = 0, 1, 2, ..., etc..
Esto significa que podemos utilizar la función DiscreteMarkovProcess.
El primer argumento representa la distribución de probabilidad sobre todos los estados en el tiempo 0. Dado que partimos de un punto donde no se ha alcanzado ninguna carta objetivo, esta es una lista que contiene un uno al inicio y el resto ceros.
Esto significa que podemos utilizar la función DiscreteMarkovProcess.
El primer argumento representa la distribución de probabilidad sobre todos los estados en el tiempo 0. Dado que partimos de un punto donde no se ha alcanzado ninguna carta objetivo, esta es una lista que contiene un uno al inicio y el resto ceros.
Ahora tenemos un objeto simbólico que representa este proceso, con nuestra matriz de transición P.
Podemos visualizar el proceso como un Graph, donde los diferentes estados (vértices) tienen distintos colores, y las probabilidades de transición se pueden ver al pasar el cursor sobre cada arista.
Podemos visualizar el proceso como un Graph, donde los diferentes estados (vértices) tienen distintos colores, y las probabilidades de transición se pueden ver al pasar el cursor sobre cada arista.
Otra función muy útil es MarkovProcessProperties, la cual nos da acceso a una gran cantidad de información sobre nuestro proceso:
Por ejemplo, TransientTotalVisitMean, que es una medida promedio de las visitas a estados transitorios antes de tener éxito finalmente.
Ahora que tenemos nuestro proceso de Markov, podemos plantear la siguiente pregunta: ¿Cuántas manos se necesitarán hasta que las 16 cartas hayan sido eliminadas por primera vez? Esto en realidad es un problema de tiempo de primer paso, donde queremos estimar el número de pasos necesarios para alcanzar el estado (final) número 17, donde ψ = 16.
La función FirstPassageTimeDistribution ha realizado el trabajo pesado de álgebra lineal por nosotros — elevando efectivamente P a todas las potencias posibles y sumando sobre todos los caminos posibles hasta el estado final.
Este es un objeto de distribución al que podemos consultar para encontrar cosas como la Función de Densidad de Probabilidad (PDF), la Función de Distribución Acumulada (CDF) y otras propiedades.
Este es un objeto de distribución al que podemos consultar para encontrar cosas como la Función de Densidad de Probabilidad (PDF), la Función de Distribución Acumulada (CDF) y otras propiedades.
Encuentre la probabilidad de un éxito exactamente en la octava mano (que vimos anteriormente):
Encuentre la probabilidad de finalización exitosa en o antes de la mano número 100:
Incluso podemos calcular el valor esperado del número de manos necesarias para lograr golpear todas las cartas objetivo con éxito:
A continuación se muestra una representación gráfica de la PDF, que indica la probabilidad de finalización en exactamente ese número de manos.
La línea de cuadrícula roja indica el valor modal de manos en 72, lo que significa que esta es la ventana más probable para completar; luego, comienza a descender. Esto se debe a que la población de secuencias que aún no han alcanzado todas las cartas objetivo en realidad está disminuyendo.
También podemos crear un DiscretePlot de la CDF, incluyendo los cuartiles Q1, Q2 y Q3 en 65, 82 y 103 respectivamente.
Esto significa que el 50% de las finalizaciones exitosas ocurren manualmente en el 82.
¿Cuándo reiniciar?
¿Cuándo reiniciar?
¿Recuerda la función que permite ‘reiniciar’ las cartas objetivo siempre que se hayan jugado 10 manos?
Deberíamos incorporar esto en nuestra exploración y tratar de averiguar exactamente en qué estados deberíamos reiniciar.
En términos sencillos, deberíamos reiniciar siempre que estemos en un estado en el que la probabilidad de éxito sea menor que la probabilidad inicial de éxito.
Deberíamos incorporar esto en nuestra exploración y tratar de averiguar exactamente en qué estados deberíamos reiniciar.
En términos sencillos, deberíamos reiniciar siempre que estemos en un estado en el que la probabilidad de éxito sea menor que la probabilidad inicial de éxito.
Cabe mencionar que el siguiente análisis efectivamente ignora las iteraciones futuras y busca maximizar la probabilidad de éxito en esta iteración actual. Tener en cuenta adecuadamente el ‘valor esperado’ (EV) puede permitir incorporar el ‘costo’ de continuar con estados de baja probabilidad de éxito.
Es útil particionar la matriz P de la siguiente manera:
La matriz Q representa las probabilidades de transiciones entre estados que aún están ‘en juego’ (transitorios), por ejemplo, 2 cartas objetivo → 3 cartas objetivo.
La matriz R representa las probabilidades de transiciones desde estados transitorios a estados de ‘éxito’, por ejemplo, 14 cartas objetivo → 16 cartas objetivo. Los estados de ‘éxito’ suelen denominarse estados de absorción.
La matriz I, en este caso, es la identidad de 1x1.
La matriz R representa las probabilidades de transiciones desde estados transitorios a estados de ‘éxito’, por ejemplo, 14 cartas objetivo → 16 cartas objetivo. Los estados de ‘éxito’ suelen denominarse estados de absorción.
La matriz I, en este caso, es la identidad de 1x1.
Por sí sola, R representa la probabilidad de éxito en exactamente una mano. Por eso, los únicos valores distintos de cero dentro de R son los dos últimos, que indican las probabilidades de acertar dos cartas objetivo desde el estado ψ = 14 y de acertar una carta objetivo desde el estado ψ = 15.
Para representar las probabilidades de tener éxito en exactamente dos manos, debemos imaginar que ‘no se tiene éxito’ en la primera mano (transitando en cambio a otro estado, descrito por Q) y luego tener éxito en la segunda mano. Por lo tanto, necesitamos el producto matricial de Q y R.
Para representar las probabilidades de tener éxito en exactamente dos manos, debemos imaginar que ‘no se tiene éxito’ en la primera mano (transitando en cambio a otro estado, descrito por Q) y luego tener éxito en la segunda mano. Por lo tanto, necesitamos el producto matricial de Q y R.
Esta lógica está encapsulada en la función successWithinNHands:
Pero en esta sección nos interesa cuáles estados intermedios (después de 10 manos) son dignos de reinicio.
Supongamos que exactamente se han jugado 10 manos. La representación interactiva creada previamente mediante ListAnimate nos indica que el resultado más probable es que se hayan conseguido 6 cartas objetivo. Quiero investigar cuáles estados son dignos de reinicio, por lo que utilizaré la función successWithinNHands con n = 45 - 10 = 35.
Al filtrar las probabilidades que son menores que la probabilidad inicial de éxito, podemos encontrar los estados que son merecedores de reinicio:
La conclusión aquí es que, si ya han pasado 10 manos y aún no hemos conseguido al menos 6 cartas objetivo, ¡deberíamos pulsar el botón de reinicio y comenzar de nuevo!
El siguiente paso es repetir este filtrado para cada posible número n de manos restantes, desde n = 45 hasta n = 1.
Creo una matriz booleana con 1 si el estado es digno de reinicio, y 0 si no lo es, o si se han jugado menos de 10 manos.
Creo una matriz booleana con 1 si el estado es digno de reinicio, y 0 si no lo es, o si se han jugado menos de 10 manos.
También debo tener en cuenta los estados que son ‘inalcanzables’ en el número de manos jugadas. Por ejemplo, no se puede alcanzar 12 cartas objetivo después de solo 3 manos, ya que se puede alcanzar un máximo de dos cartas objetivo por mano. Asignaré -1 a estos estados ‘inalcanzables’.
El MatrixPlot anterior describe cuándo debemos ‘Reiniciar’ o ‘Continuar’ según cuántas manos quedan hasta el límite de 45 manos, y cuántas cartas objetivo han sido seleccionadas. También he marcado en negro los estados inalcanzables. El eje n disminuye de izquierda a derecha para representar que nos acercamos al final de una iteración, y el eje ψ aumenta a medida que se baja de arriba hacia abajo.
Veamos un ejemplo, con 25 manos restantes.
Primero obtenemos los valores en la matriz booleana correspondiente a n = 25:
Primero obtenemos los valores en la matriz booleana correspondiente a n = 25:
Esto implica que deberíamos reiniciar para cualquier cantidad de cartas objetivo eliminadas ≤ 9. Si luego obtenemos las probabilidades usando successWithinNHands, seleccionando aquellas que sean menores que initProb, podemos verificar este resultado.
Imagine la escena: se han jugado 44 manos y está a punto de recibir sus cartas en la mano 45. Si ha llegado hasta aquí, le quedan 1 o 2 cartas objetivo que debe conseguir para girar la ruleta y ganar un premio. ¡En realidad, nuestros cálculos nos indican que tiene menos probabilidad de ganar en este estado que si reiniciara y empezara desde cero!
Este es un resultado bastante contraintuitivo, y cualquier persona que juegue probablemente simplemente ‘se arriesgaría’, especialmente considerando que las cartas objetivo se reinician automáticamente si no tiene éxito.
Conclusión
Conclusión
¡Esta exploración fue muy agradable y tomó muy poco tiempo realizarla! Al modelar el proceso como una cadena de Márkov, pude analizar las probabilidades de transición, las distribuciones acumulativas y las estrategias óptimas de reinicio. Espero que los educadores puedan utilizar esto como un recurso para mostrar cómo las ideas probabilísticas abstractas pueden aplicarse a problemas de decisión del mundo real.
También debo dar crédito a Harrison Boon por sugerir algunos de los métodos de investigación incluidos en este trabajo.
CITE ESTE CUADERNO
CITE ESTE CUADERNO
Las estadísticas detrás del ‘Card Strike’ de 888 Poker
por Joseph Brennan
Comunidad Wolfram, STAFF PICKS, 29 de octubre de 2025
https://community.wolfram.com/groups/-/m/t/3567108
por Joseph Brennan
Comunidad Wolfram, STAFF PICKS, 29 de octubre de 2025
https://community.wolfram.com/groups/-/m/t/3567108