M.O.A.T. (Mother Of All Tables)

El otro día, buscando en qué dejarme los dineros de la nómina, cayó en mis manos el manual de Dreamriders, cuyo sistema de juego utiliza una elevada cantidad de dados de múltiples tipos, predominando los d10, d8 y d12. Ante mi se presentaba un dilema, y es que no tenía dados suficientes. Hasta que se me ocurrió la M.O.A.T.

A ver, no nos llevemos a engaño, la idea no es nueva ni original, y posiblemente tampoco sea muy práctica. Pero la idea de minimizar los recursos necesarios para jugar a cualquier juego me parece interesantísima. No me juzguéis muy duramente.

En cualquier caso, ¿Qué es la M.O.A.T. ? La traducción de sus siglas sería “La madre de todas las tablas”, y su propósito es minimizar el número de dados que se utilizan para según que juegos. De hecho, sería suficiente con utilizar de 2 a 4 dados para emular cualquier otro: un dado de 10 caras de decenas y otro dado, también de 10 caras, para marcar las unidades (opcionalmente, otro par de dados similares pero de otro color permite mayor granularidad). Dicho de otra forma, con la M.O.A.T. vamos a “emular” otras tiradas de dados, sin tenerlos.

¿Imaginais tener que tirar todo esto a la vez? Vamos a ver si lo solventamos

Para ello, vamos a distinguir los 3 casos más típicos (que no únicos) que pueden darse en un sistema de rol:

  • Tirada de un único dado
  • Tirada de múltiples dados con acumulación de éxitos
  • Tirada de múltiples dados con suma de los resultados

Una vez explicados estos 3 casos típicos, daré algunas notas acerca del programa con el que se ha generado la tabla y acerca de la tabla en sí.

Un único dado

Éste es el caso más sencillo, y sobre el que vamos a explicar el concepto principal para poder emular cualquier tirada de cualquier dado ( bueno, casi; luego vemos algunas excepciones), además de estar presente en una de las ediciones más conocidas de uno de los juegos más conocidos del mundo rolero: Dungeons & Dragons (al menos, a partir de su 3º edición). El razonamiento aquí es bastante simple: si cada cara de un dado tiene una probabilidad de aparecer, y dicha probabilidad se puede expresar en forma de porcentaje, entonces podemos emular esa tirada basándonos en el porcentaje de aparición de dicho resultado con una tirada de un dado de 100 caras. Vamos a verlo con un ejemplo:

Supongamos que queremos emular un dado de 20 caras; para ello, calcularíamos la probabilidad de obtener una de las caras, siguiendo para ello la fórmula general para obtener la probabilidad de un suceso: el número de casos favorables entre los casos posibles, o lo que es lo mismo:

1 cara concreta entre 20 posibles = 1/20 = 0.05 => 5%

Sabiendo esto, podemos establecer el paralelismo entre el porcentaje y el número de un dado de 100 caras; para este caso, podríamos establecer que, por cada 5 números del dado de 100, emulamos una de las caras de un dado de 20. Si realizamos el cálculo:

5 caras concretas entre 100 posibles = 5/100 = 0.05 = 5%

Como veis, la probabilidad es la misma. ¿cómo traducimos esto, pues? sencillo: primero, tabulamos los números del 1 al 20 y,tras esto, establecemos incrementos de 5 en 5 para esos mismo valores. Y ya está, tenemos una emulación de un dado de 20 caras. Para ello, simplemente lanza un dado de 100 y consulta el rango en el que se encuentra.

Soy consciente de que esta aplicación es bastante poco práctica; sin embargo, a veces entran en escena dados realmente raros, como de 16, 24 o 30 caras (que se utilizan, por ejemplo, en “Clásicos del Mazmorreo”), que son bastante más complicados de encontrar, y éste sistema puede dar una alternativa al clásico “lanza el dado más cercano y superior e ignora los resultados no válidos” (para el d16, lanza un d20 e ignora los resultados mayores a 16) o “utiliza una combinación de dados, siendo uno de ellos de control” (para un d30, lanza un d10 y un d6, utilizando éste último como dado de control: 1-2 -> resultados de 1 a 10, 3-4 -> de 11 a 20 y 5-6 -> de 21 a 30).

Múltiples dados por acumulación de éxitos

Éste caso ya lo hemos visto parcialmente en el artículo anterior, además de estar presente en, entre otros, el archiconocido Vampiro: La mascarada; para obtener los valores de éstas tiradas, vamos a utilizar la distribución binomial, cuya fórmula, que no mostré en el anterior artículo, es esta:

Fórmula extraía de Wikipedia (https://es.wikipedia.org/wiki/Distribuci%C3%B3n_binomial)

Hay una demostración de la obtención de ésta fórmula aquí, y tenéis bastante información sobre la distribución en sí aquí, pero para resumir, podemos utilizar esta fórmula cuando:

  • Se realizan un número n de experimentos
  • La probabilidad de cada uno de esos experimentos es de p, y su contraria de q = 1-p (ensayo de Bernouilli)

Cuando se dan estas dos condiciones, podemos hablar de una variable aleatoria que se rige por la distribución binomial, y por tanto, podemos obtener su distribución de probabilidad introduciendo los datos apropiados en la fórmula anterior.

Ahora bien, en ésta distribución las probabilidades no están uniformemente repartidas, habiendo valores para los cuales la probabilidad es mayor que para otros, pero para solventar este punto, simplemente, recurrimos al mismo truco que antes; esto es,tabular los resultados. La diferencia es que ahora los rangos serán desiguales, pero vendrán dados por la suma de la probabilidad anterior con la actual; por ejemplo, para obtener el rango de probabilidades de obtener uno o más 4 en 3 dados de 6 caras, bastará con ver la probabilidad de dicho suceso, traducirla a un número en función de su porcentaje y colocarla en la tabla, pues éste será el incremento a investigar.

Este ejemplo ya es algo más práctico, dado que a veces conseguir un número de dados elevado de según que tipo es más complicado, siendo el ejemplo de la introducción el más paradigmático.

Hay que tener en cuenta una serie de detalles para ésta parte del artículo:

  1. Los dados deben ser del mismo tipo. una tirada de 2d12 + 3d8 se deberá tratar como dos tiradas distintas cuyos resultados se tratarán como corresponda ( sumándolos o similares).
  2. Puede darse el caso en que una distribución tenga decimales. Hay dos posibles soluciones, una de ellas pasaría por incluir un tercer dado (o incluso un cuarto), para generar números de hasta 1000 y así poder tener uno o dos decimales más, aunque pueda dar según qué complicaciones adicionales que habría que comprobar; y la segunda sería el redondeo. En el documento final se incluye una aproximación con dos decimales de cada resultado
  3. La fórmula dada antes solo calcula uno de los casos. Para construir la tabla completa, hay que repetir el cálculo por cada uno de los posibles resultados. Además de ésto, la tabla se ha construido sobre la premisa del “x o más”, que se ha calculado sumando todas las probabilidades implicadas; por ejemplo, en un dado de 6 caras, obtener un 4 o más se ha calculado sumando la probabilidad de obtener un 4, un 5 y un 6. Existen calculadoras de distribución binomial que contemplan el caso de la acumulación, pero en este caso, se ha hecho por medio del programa utilizado.

Múltiples dados por Suma

Por último, el tercer caso que se nos presenta es la suma de resultados, presente en sistemas como XD6, Mini Six o el archiconocido sistema D6 de las antiguas ediciones de Star Wars o Fanhunter.

Por lo que he podido investigar, no he encontrado un método analitico por el que, mediante una función, pueda obtener la probabilidad de obtener cada una de las sumas, pero al menos si he podido establecer determinados hechos que me han ayudado a establecer el algoritmo con el que he calculado la probabilidad para éstos casos:

  • Primero, el límite inferior de la suma de dados será igual al número de dados, por que el mínimo caso de suma posible es en el que todos los dados presentes sumen 1
  • Segundo, el límite superior de la suma de dados será igual al producto del número de dados por el número de caras de cada dado; siguiendo el razonamiento anterior, el mejor caso posible con respecto a la suma será en el que cada dado muestre su cara máxima; cabe destacar que éste razonamiento se basa en dados normales, o lo que es lo mismo, aquellos en los que las caras están numeradas del 1 al número de caras.
  • Tercero, entre el límite superior y el límite inferior se pasará por cada número natural, o lo que es lo mismo, entre dicho rango se establecen incrementos de 1, y habrá al menos una combinación por cada número. Numéricamente es fácil ver que, si iteramos por cada una de las combinaciones posibles, pasaremos por todos los números entre dicho rango.
  • Cuarto, el número total de combinaciones será el número de caras de cada dado elevado al número de dados. éste es, sin duda, el más fácil de demostrar  de todos, ya que nos regimos por la fórmula de las Variaciones con Repetición que podemos ver aquí.

Sin embargo, para calcular la probabilidad, no nos es suficiente con estos hechos; deberemos calcular el número de veces que se repite una suma concreta de manera manual (o utilizar un programa que lo haga por tí, GUIÑO GUIÑO) y, una vez calculado, dividiremos ese número de ocurrencias de cada suma entre el número total de combinaciones, de manera que obtendremos la probabilidad de cada suma ( puesto que, en dicha división, estamos obteniendo el coeficiente entre los casos favorables y los casos posibles).

En el programa adjunto a éste artículo se puede ver un algoritmo basado en el uso de Variaciones con repetición (Gracias a Salvador Perez por pasarme esa función, me estaba volviendo loco buscando cómo programarla). Una vez obtenidas las probabilidades, pasaríamos a tabularlo como el ejemplo anterior.

Y con ésto ya estarían cubiertos gran parte de los sistemas más comunes; bien es verdad que algunos sistemas son mucho más complicados de emular y los cálculos serían más complicados, como en el sistema de Cthulhutech, el sistema Hitos, el sistema de la edición antigua de 7º Mar o los sistemas de los 3 juegos de rol de Star Wars de Edge, por poner un puñado de ejemplos.

Breves notas sobre el programa y la M.O.A.T.

Respecto al programa generador de la M.O.A.T.

  • El programa MOATGenerator ha sido escrito en python con el propósito de poder ser ejecutado independientemente del sistema operativo. Cabe destacar que es la primera vez que programo en python, así que si veis alguna burrada que pueda (y deba) ser escrita de manera más acorde con el lenguaje lo achacaré a que “era mi primerito día”. Me interesaba más que funcionara y que fuera legible.
  • Además de la función facilitada por Salvador Pérez, quiero añadir que he utilizado una función extraída de la página “StackOverflow” creada por el usuario ‘thavan’ ; tenéis un enlace al post concreto en el fuente del programa.

Respecto a la M.O.A.T.

  • Los valores generados siempre tienen dos decimales, para dar algo de granularidad adicional, aunque para replicarla tal y como se describe debiera usarse un segundo par de dados d100. No he sabido decidirme por una solución que proporcione tanta granularidad y que minimice el número de dados a utilizar, de manera que, a la vista de los datos, que cada cual se sienta libre de utilizarlos como quiera o de utilizar segundas tiradas o dados adicionales.
  • Además de ésto último, existen valores con una variación entre ellos tan pequeña que se necesitarían del orden de 6 u 8 dados para poder emularlo con exactitud. Dado que este hecho choca frontalmente con el pretexto de utilización de la M.O.A.T. se ha tomado la decisión de compromiso de añadir los modificadores SIEMPRE y NUNCA, que sustituyen los valores estrictamente mayores a 99.99 y estrictamente menores a 0.01. En algunos casos, siendo los más sangrantes aquellos relacionados con la acumulación de éxitos en tiradas con gran cantidad de dados de muchas caras y dificultades bajas, estos valores aparecerán repetidas veces. Una vez más, queda a criterio de los usuarios el cómo utilizar dicha información, aunque yo recomiendo utilizar el mayor de los valores posibles en los porcentajes bajos y el menor en los porcentajes altos.

Y creo que con ésto voy a ir concluyendo el artículo. La próxima vez, prometo traer algo menos denso, pero reconozco que tenía muchísimas ganas de sacar este artículo a la luz y, aunque ha habido momentos en los que casi lo mando al carajo, estoy tremendamente satisfecho con el resultado (no con lo que he tardado en redactarlo, eso si, que esto ha parecido la obra de El Escorial). Una vez más, dejad vuestras opiniones, dudas, aclaraciones o quejas en los comentarios y trataré de responderos cuando pueda.

¡Un saludo!

M.O.A.T. (Fichero .txt)

MOATGenerator (Fichero .py)


Una vez más, muchas gracias a todos los que habéis revisado el artículo y me habéis ayudado a darle forma: Jenni, Salva, Dani, Abel, Juanlu y Seba.

1 Comentario

Dejar respuesta

:Sarcastic:  :Grin:  :Not-Amused:  :Money-Mouth:  :Mini-Frown:  :Footinmouth:  :Slant:  :Sealed:  :Embarrassed:  :Ambivalent:  :Cool:  :Laughing:  :Sick:  :HeartEyes:  :Gasp:  :Thumbs-Up:  :Wink:  :Cry:  :Smile:  :Heart:  :Angry:  :Thumbs-Down:  :Content:  :Yum:  :Frown:  :Yuck:  :Innocent:  :Mini-Smile:  :Crazy:  :Kiss:  :Naughty:  :Confused:  :Nerd: