Un reparto de solitario necesita ser impredecible cuando lo inicias y repetible cuando quieres examinarlo más tarde. Esos requisitos encajan si la baraja comienza con una semilla: un número que determina cómo se ordenan las cartas.

Cards4.net utiliza este enfoque para sus juegos de solitario. La semilla nos permite recrear un reparto para volver a jugarlo, un desafío diario o un informe de error. Lo que varía entre los modos es cómo elegimos ese número, y esa elección importa cuando describimos un reparto como aleatorio o resoluble.

De un número a una baraja

Nuestro motor compartido de cartas inicializa con la semilla el generador de números pseudoaleatorios exsplus de Erlang y después llama a Enum.shuffle de Elixir para reordenar las cartas. El generador produce una secuencia repetible de valores, por eso la misma entrada puede darnos la misma baraja barajada.

Para recrear una posición inicial, también necesitamos el juego y su variante. Klondike, FreeCell y Spider disponen sus cartas de forma diferente, y el número de palos de Spider cambia la baraja misma. Una semilla es por tanto significativa junto con esas reglas y la implementación que las interpreta.

Esta repetibilidad aplica a la implementación actual. Un cambio en el orden inicial de la baraja o en el procedimiento de barajado podría cambiar el resultado del reparto. La semilla sirve como referencia para un juego, pero no es una promesa de que cualquier futura implementación interprete el número de la misma manera.

De dónde viene la semilla

Para una solicitud normal aleatoria de un solo jugador, el servidor elige un número entre cero y 2^63 - 1 usando el módulo rand de Erlang. Luego da ese número al motor de juego. La selección no utiliza las últimas victorias o derrotas del jugador o su historial de cuenta.

También hay una función auxiliar en el motor que puede obtener una semilla desde :crypto.strong_rand_bytes. Su presencia no significa que cada solicitud de juego la utilice: la ruta normal de solicitud descrita anteriormente elige su semilla mediante rand.

Esa distinción importa porque ni el generador de la solicitud ni el generador exsplus inicializado con una semilla deben describirse como seguros criptográficamente. La documentación de Erlang distingue claramente sus generadores pseudoaleatorios de los generadores adecuados para la criptografía. Nuestra implementación nos da repartos de solitario reproducibles; no proporciona un protocolo de imparcialidad criptográfica.

¿Cuántas disposiciones son posibles?

Una baraja de 52 cartas distintas tiene 52! posibles órdenes, aproximadamente 8,07 × 10^67. Ese número cuenta cada elección para la primera carta, multiplicada por cada elección restante para la segunda, y así sucesivamente.

Una semilla de 63 bits puede tomar solo 2^63 valores, aproximadamente 9,22 × 10^18. Como cada semilla produce un único resultado bajo una implementación fija, puede alcanzar como máximo ese número de órdenes de baraja, y posiblemente menos si diferentes semillas producen el mismo orden. No podemos afirmar que muestreamos cada posible disposición de una baraja física.

El número más pequeño aún es grande, pero su tamaño por sí solo no prueba la calidad de la distribución. De igual manera, unos pocos repartos incómodos no establecen que el barajado esté sesgado. Una investigación significativa necesita semillas registradas, los ajustes relevantes del juego y suficientes resultados para probar una afirmación específica.

Los repartos resolubles usan un conjunto más pequeño

El modo resoluble añade un paso de selección antes del barajado. Los solucionadores examinan previamente los repartos y registran semillas para las que encuentran un camino ganador. Cuando la biblioteca relevante está disponible, el servidor elige al azar una entrada de ese conjunto.

El resultado del reparto es reproducible de la misma manera que uno ordinario, pero proviene de una colección filtrada. Los repartos que el solucionador no pudo terminar están ausentes, incluso cuando una solución podría existir. El conjunto es finito, por lo que ver un reparto nuevamente es posible.

Los desafíos diarios eligen de estas bibliotecas también, usando el juego, la variante y la fecha UTC para seleccionar una entrada. Todos los jugadores que juegan al desafío del día en la misma variante reciben la misma posición. La elección es fija para el día en lugar de realizarse por separado para cada jugador.

Los repartos de FreeCell numerados por Microsoft usan su propio algoritmo de compatibilidad. Sus números pertenecen a ese sistema; no son intercambiables con nuestras semillas de barajado ordinarias. La guía de números de reparto explica cómo abrir uno particular.

Lo que puedes verificar tú mismo

La página de imparcialidad puede reconstruir posiciones iniciales para Klondike de una y tres cartas, FreeCell y Spider de uno, dos y cuatro palos desde sus semillas públicas. Comparar el resultado con el reparto original permite verificar que la semilla y el tablero coincidan.

Esa herramienta utiliza nuestro backend. No establece de forma independiente cómo se eligió la semilla, ni demuestra que el proceso de selección sea imparcial o que el reparto tenga solución. Esas son preguntas separadas.

Para un reparto sospechoso o un informe de error, conserva la semilla y la variante junto con una descripción de lo que pasó. Una posición reproducible nos da algo con lo que investigar. Calificar un barajado de imparcial es mucho menos útil a menos que también expliquemos qué se puede verificar.

Preguntas frecuentes

¿Puedo reproducir un reparto de Cards4.net?

Para juegos de solitario compatibles, la misma semilla, variante y implementación del barajado reproducen la misma posición inicial. La página de imparcialidad puede reconstruir esa posición.

¿Qué generador de números aleatorios utiliza el barajado?

El motor inicializa con la semilla el generador pseudoaleatorio exsplus de Erlang y llama a Enum.shuffle. Las solicitudes de partidas individuales también usan un generador pseudoaleatorio para seleccionar una semilla de 63 bits.

¿Puede el barajado producir cualquier orden posible de la baraja?

No. Una implementación fija con una semilla de 63 bits puede producir como máximo 2^63 resultados distintos, muchos menos que los 52! órdenes de una baraja estándar.

¿La página de imparcialidad prueba que la selección de semilla es imparcial?

No. Verifica que una semilla reproduce una posición inicial. Como utiliza nuestro servidor, no es una auditoría independiente o prueba de cómo se eligió la semilla.

Lectura relacionada