7 votos

Calabozos y Dragones: Combinaciones de puntuaciones de habilidad

Estoy intentando averiguar qué probabilidad hay de sacar una determinada combinación de 6 puntuaciones de habilidad en Dragones y Mazmorras.

edit: Dragones y Mazmorras es un juego de rol de mesa. Creas un personaje en un mundo de fantasía que tiene 6 estadísticas principales, Fuerza, Destreza, Constitución, Inteligencia, Sabiduría y Carisma. Estas puntuaciones de habilidad determinan los poderes que un personaje puede utilizar y su fuerza. Las puntuaciones de habilidad se tiran con 4 dados de 6 caras (4d6) y luego se usan las 3 puntuaciones más altas, lo que te da valores $\in [3, 18]$ para los posibles valores. Mi objetivo es calcular la probabilidad de obtener una combinación como (8, 8, 8, 8, 8) o (15, 14, 13, 12, 10, 8). /edit

Ya he calculado las probabilidades de sacar una sola estadística y una pregunta aquí confirmó que hice bien las cuentas:

3: $\frac{1}{1296}$ , 4: $\frac{4}{1296}$ , 5: $\frac{10}{1296}$ , 6: $\frac{21}{1296}$ , 7: $\frac{38}{1296}$ , 8: $\frac{62}{1296}$ , 9: $\frac{91}{1296}$ , 10: $\frac{122}{1296}$ , 11: $\frac{148}{1296}$ , 12: $\frac{167}{1296}$ , 13: $\frac{172}{1296}$ , 14: $\frac{160}{1296}$ , 15: $\frac{131}{1296}$ , 16: $\frac{94}{1296}$ , 17: $\frac{54}{1296}$ , 18: $\frac{21}{1296}$

Ahora, utilizando el mismo razonamiento, he conseguido calcular las probabilidades de las combinaciones basadas en la suma de las puntuaciones de las habilidades, pero sólo si los resultados son igualmente probables. Usé Python para calcular las probabilidades así:

def probability_of_outcomes(outcomes, repetitions, subsum=slice(None, None, None)):
    probability_dict = {}
    sum_combinations = 0
    for c in combinations_with_replacement(outcomes, repetitions):
        for p in set(permutations(c, repetitions)):
            s = sum(sorted(p)[subsum])
            if s in probability_dict:
                probability_dict[s] += 1
            else:
                probability_dict[s] = 1
            sum_combinations += 1

return probability_dict, sum_combinations

if __name__ == "__main__":
    all_comb, num_combinations_stats = probability_of_outcomes(range(1, 7) 4, subsum=slice(1, None, None))

de la misma manera que puedo calcular:

abilities_comb, num_combinations_ability = probability_of_outcomes(range(3, 19) 6)

Ahora con el primer cálculo ya veo que no todos los números son igual de probables, pero no estoy seguro de dónde añadir esa probabilidad. Además el enfoque no es muy elegante, ya que simplemente pruebo todas las combinaciones posibles.

¿Alguna idea?

0 votos

No todo el mundo juega a DnD, por favor, explica con palabras sencillas qué probabilidad estás tratando de calcular.

1 votos

Parece que estás utilizando el método de "tirar cuatro dados e ignorar el más pequeño". ¿Es eso cierto?

0 votos

@MJD sí que es el método que uso en el primer ejemplo con el subsum . Pero cuando se especifica Ninguno, el código sólo toma todos los resultados (que es para la segunda llamada).

5voto

orlp Puntos 373

Ordena primero la combinación, por ejemplo $(8, 10, 12, 13, 14, 15)$ . A continuación, calcule la probabilidad exacta de sacar esta combinación en este orden. Este cálculo es sencillo, sólo hay que multiplicar las probabilidades de las tiradas individuales que has calculado antes:

$$p(8) \times p(10) \times p(12) \times p(13) \times p(14) \times p(15)$$

Pero estamos contando menos. Después de todo, es posible que hayas rodado $15$ primero en lugar de último. Así que multiplicamos por $6!$ para tener en cuenta todas las permutaciones:

$$p(8) \times p(10) \times p(12) \times p(13) \times p(14) \times p(15) \times 6!$$

En este caso hemos terminado, porque todos los atributos son únicos. Cuando este no es el caso, ahora estamos contando de más. Porque en un ejemplo de dos dados, si se intercambia el orden de sacar dos seises, nada cambia.

Así que para terminar el cálculo hay que calcular el número de pedidos considerando los duplicados .

Si $a$ es el conjunto de atributos, $a_1$ es el primer atributo, $a_2$ el segundo, etc, $|a_1|$ es el número de veces que aparece el primer atributo, y $k$ es el número de atributos distintos, la fórmula completa es:

$$p(a) = p(a_1)^{|a_1|}p(a_2)^{|a_2|}\cdots p(a_k)^{|a_k|} \cdot \frac{k!}{|a_1|!|a_2|!\cdots|a_k|!}$$

Obsérvese que en nuestro ejemplo anterior, en el que todos los atributos eran distintos, el denominador desaparecía porque era simplemente $1! \cdot 1! \cdots 1! = 1$ .

Y en el otro extremo, cuando el multiconjunto sólo tiene un único elemento repetido, como en $(8, 8, 8, 8, 8, 8)$ obtenemos:

$$p(8)^6\cdot \frac{6!}{6!} = p(8)^6$$

Como era de esperar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X