4 votos

Ayuda con las probabilidades en un juego que estoy haciendo

Estoy trabajando en la creación de un juego de rol y estoy tratando de entender las estadísticas de la mecánica principal para que pueda determinar la eficacia de la nivelación y las bonificaciones.

Ahora mismo la mecánica principal es una mecánica basada en un dado de habilidad donde tiras un d4, d6, d8 o d10 basado en tu habilidad con la oposición de una DC establecida por el narrador (1-10) o el resultado de otro dado a través de una tirada opuesta. (una DC es el número que el dado debe sacar como mínimo, por ejemplo si el dado necesita sacar un 6 o más entonces la DC sería 6)

Estoy experimentando con lanzar dos dados y elegir el más alto de los dos, sin embargo no sé cómo hacer un modelo estadístico para esto. Especialmente debido al hecho de que estoy planeando usar dados explosivos. (Los dados explosivos ocurren cuando sacas el número más alto posible en el dado. Si esto ocurre, se vuelve a tirar el dado, sumándolo al valor total de la tirada. Esto puede continuar un número infinito de veces teóricamente).

Agradecería mucho que me ayudaran a encontrar una fórmula para ello. Quiero crear una hoja de Excel para comparar diferentes métodos de bonificación, así que me gustaría algo en lo que pueda poner la fórmula y ajustarla en lugar de sólo las probabilidades enumeradas.

2 votos

Esto podría responderse mejor en el sitio de matemáticas de stack exchange math.stackexchange.com

2 votos

¡Bienvenido! Me alegra saber que estás trabajando en un juego. Sin embargo, he votado para cerrar esta pregunta. El motivo es que las preguntas aquí deben ser específicas y con respuesta. Ahora mismo lo único que podemos hacer con esta pregunta es remitirte a una fuente externa. Tal vez una mejor táctica sería comenzar a crear su modelo estadístico y preguntarnos si se encuentra con algún problema. Nos has dicho muy poco sobre tu sistema y aún menos sobre lo que estás tratando de lograr con tu mecánica. A falta de enlazarte con anydice o algo similar, no hay mucho más que podamos darte.

5 votos

En este sentido, te animo a que sigas preguntando a medida que te encuentres con problemas específicos en tus esfuerzos de desarrollo de juegos. Como menciona Phil, a veces las matemáticas pueden estar fuera del alcance de este sitio y Validación cruzada o Matemáticas podrían ser mejores lugares para preguntar, pero la mayoría de las preguntas específicas relacionadas con el desarrollo de juegos de rol se pueden plantear aquí y nos encantaría ayudar.

7voto

vbence Puntos 145

AnyDice tiene muchas herramientas para la probabilidad de los dados. Consulta la documentación.

Por ejemplo, output d4 > d4 da la probabilidad de que un jugador d4 gane a otro. Hay un 37,5% de posibilidades de que el primer jugador gane la tirada en esa situación.

0 votos

Esto no parece responder a la pregunta, que pide una "fórmula".

1 votos

Esta respuesta era anterior a la migración y es para los diseñadores de juegos que quieren entender las curvas de probabilidad rápidamente sin tener que aprender los términos estadísticos.

4voto

jldugger Puntos 7490

Aquí se plantean tres cuestiones. En todos los casos, excepto en uno (inusual), podemos derivar fórmulas cerradas o respuestas que requieren un número pequeño y fijo de sumas: no se necesitan bucles dobles, triples o incluso cuádruples. Voy a exponer y responder a cada una de las preguntas, proporcionando ejemplos prácticos en cada caso.

(Como apunte: ¿por qué debería importarnos la eficiencia en estos cálculos? Porque estos dados son los bloques de construcción de lo que podría convertirse en escenarios de juego extremadamente complejos. Puede ser atractivo estudiar muchas variaciones del juego, lo que puede requerir considerar millones de dados ligeramente diferentes. Este tipo de análisis es posible cuando los cálculos básicos de probabilidad son muy rápidos).

Se consideran varias variantes de cada pregunta, dependiendo de si los dados son justos o no y, cuando los concursantes compiten cara a cara, si utilizan los mismos dados o no. Considerar los dados injustos es muy general, ya que incluye situaciones en las que los jugadores suman los valores de dos o más lanzamientos de dados independientes.

Sólo se necesitan unas pocas reglas básicas de probabilidad para abordar casi todas estas situaciones. En primer lugar, se suman las probabilidades de resultados mutuamente excluyentes. Cuando estos resultados agotan todas las posibilidades, las probabilidades deben sumar $1$ . En segundo lugar, las probabilidades de resultados independientes se multiplican. En un caso (al final), se necesita una regla fundamental de la probabilidad condicional: la probabilidad de un evento $A$ es igual a la probabilidad de algún otro evento $B$ veces el probabilidad condicional de $A$ dado $B$ .


  1. ¿Cuál es la probabilidad de que un $d_n$ ¿Igualará o superará una CC? Por ejemplo, ¿cuál es la probabilidad de que un $d_8$ será igual o superior a $5$ ?

    Si el dado es justo, la probabilidad de cada resultado es $1/n$ y $n-DC+1$ de esos resultados igualan o superan $DC$ De ahí que el azar sea $(n-DC+1)/n$ . Por ejemplo, un $d_8$ tiene un $(8-5+1)/8$ = $50$ de probabilidad de igualar o superar $5$ .

    Si el dado está cargado (o se construye sumando otros dados), dejemos que $p_i$ ser la oportunidad que muestra el valor $i$ . La posibilidad de igualar o superar $DC$ se obtiene sumando sobre esos outomes mutuamente excluyentes, $\sum_{i\ge DC}p_i$ . La posibilidad de caer por debajo del $DC$ es, de manera similar, $p_1+p_2+\ldots+p_{DC-1}$ que llamaré $P_{DC}$ (con mayúscula) $P$ ). Estos números (que son acumulado posibilidades) aparecen de nuevo a continuación.

  2. ¿Cuál es la probabilidad de que un $d_n$ será igual o superior a un $d_m$ ?

    Cuando los dados son iguales, entonces $n=m$ y la posibilidad de que ambos sean $i$ es igual a $p_i^2$ . Así, considerando los resultados mutuamente excluyentes de dos $1$ 's, dos $2$ etc., la posibilidad de empate es $\Pr(tie)=\sum_{i=1}^n p_i^2$ . Como los jugadores están emparejados, se reparten las posibilidades de ganar directamente, por lo que la posibilidad de ganar es igual a $(1 - \Pr(tie))/2$ . Por ejemplo, la probabilidad de un empate entre dos $d_8$ es $\sum_i (1/8)^2$ = $1/8$ y (por lo tanto) la posibilidad de ganar es $(1-1/8)/2$ = $7/16$ y la posibilidad de una pérdida también es $7/16$ .

    Cuando los dados son diferentes, normalmente no hay otra opción que buscar todas las posibilidades. Pero esto no requiere $m n$ cálculos. Supongamos -sin pérdida de generalidad- que $m \le n$ . Dejemos que las probabilidades para el $d_n$ sea $p_1, p_2, \ldots, p_n$ y que las probabilidades para el $d_m$ sea $q_1, q_2, \ldots, q_m$ . La posibilidad de que el $d_n$ muestra $i$ y el $d_m$ muestra $j$ es por lo tanto $p_i q_j$ .

    • La probabilidad de empate se calcula de forma similar a la anterior, pero la suma debe detenerse en el valor común más alto posible: $\Pr(tie) = \sum_{i=1}^m p_i q_i$ . Eso lleva $O(m)$ cálculos (en concreto, $m$ multiplicaciones y $m-1$ adiciones).

    • La posibilidad de que el $d_m$ se puede encontrar imaginando una tabla de todos los resultados, con el $d_n$ designando las filas y los $d_m$ las columnas. La página web $d_m$ gana en todas las celdas de la diagonal superior. Se puede pensar que éstas comprenden $m-1$ tiras verticales. Las tiras forman una escalera: sólo hay una celda en la tira para un resultado de $2$ (porque sólo un $1$ es menor), hay dos celdas para $3$ y así sucesivamente. Sea $P_i = p_1 + p_2 + \cdots + p_{i-1}$ sea la posibilidad de que el $d_n$ es menos que $i$ . La suma de las franjas da como resultado $\sum_{i=2}^m P_i q_i$ por la posibilidad de que el $d_m$ gana. Calculando el $P_i$ sólo requiere $O(m)$ trabajo ( $m-2$ adiciones) y el cálculo de la suma es de nuevo $O(m)$ ( $m-1$ multiplicaciones y $m-2$ adiciones). Por último, la posibilidad de que el $d_n$ se obtiene observando que las tres probabilidades -ganar, empatar, perder- deben sumar 1. Así, obtenemos todas las probabilidades deseadas con $2m-1$ multiplicaciones, $3m-4$ sumas, y una resta y $m$ es el tamaño del más pequeño morir.

    Ejemplo

    Pongamos una feria $d_4$ contra una suma de $d_2$ y un $d_3$ que es una forma de carga $d_5$ . Aquí $n=5$ y $m=4$ . Podemos calcular las posibilidades de esto $d_5$ fácilmente; son $p_1=0$ , $p_2=p_5=1/6$ y $p_3=p_4=1/3$ que puede ser abreviado por el vector $(0,1/6,1/3,1/3,1/6)$ . Así, las sumas acumuladas $P_i$ son $(0,1/6,1/2)$ (nos detenemos en $1/2$ porque es todo lo que necesitaremos; las dos siguientes sumas acumulativas son $5/6$ y $1$ ). Las probabilidades para la feria $d_4$ son, por supuesto, $(1/4,1/4,1/4,1/4)$ . Por lo tanto, la posibilidad de un empate es $(0(1/4) + (1/6)(1/4) + (1/3)(1/4) + (1/3)(1/4)$ = $5/24$ . La posibilidad de un $d_4$ ganar es $(0)(1/4) +(1/6)(1/4) + (1/2)(1/4)$ = $1/6$ . Por lo tanto, la posibilidad de que el $d_5$ gana es igual a $1 - (5/24 + 1/6)$ = $5/8$ . No tuvimos que calcular todos los $6\times 4=24$ casos para obtener estas respuestas.

  3. ¿Cómo se hace frente a los dados que explotan?

    Consideremos sólo dos dados equivalentes (aunque no tienen que ser justos), digamos con probabilidades $(p_1,p_2,\ldots,p_n)$ . El único momento en el que una "explosión" podría marcar la diferencia es cuando ambos tirada de dados una $n$ y luego se repite el procedimiento. Sea $z$ la posibilidad de un empate. Entonces, o bien se produce un empate con un valor inferior a $n$ --que tiene la posibilidad de $\sum_{i=1}^{n-1}p_i^2$ de suceder o bien ambos dados ruedan $n$ (que tiene una oportunidad $p_n^2$ de suceder) y un empate posteriormente se produce, con el azar $z$ . Al resolver esta ecuación se obtiene $z = \sum_{i=1}^{n-1}p_i^2 / (1 - p_n^2)$ . Como los dados son equivalentes, entonces -razonando como antes- los dos jugadores se reparten las posibilidades restantes a partes iguales entre ganar y perder.

    (El caso de dos dados explosivos no equivalentes -especialmente cuando cada uno tiene un valor máximo diferente al que explota- puede resolverse, pero como son posibles infinitos resultados, las soluciones eficientes requieren manipular las funciones generadoras de probabilidad y, en última instancia, hacer aproximaciones numéricas).

    Ejemplo

    Que los dos jugadores utilicen una suma de dos justas $d_6$ 's, explotando en el valor máximo de $12$ . El vector de probabilidad para una tirada es $(0,1/36,2/36,3/36,4/36,5/36,6/36,5/36,4/36,3/36,2/36,1/36)$ . Entonces $\sum_{i=1}^{12-1}p_i^2$ = $0^2 + (1/36)^2 + \cdots + (2/36)^2$ = $145/1296 \approx 0.11188$ y $1 - p_n^2$ = $1 - (1/36)^2$ = $1295/1296$ . Por lo tanto, la posibilidad de un empate es $(145/1296) / (1295/1296)$ = $29/259 \approx 0.11197$ . La posibilidad de ganar es igual a $(1 - 29/259)/2$ = $115/259 \approx 0.444015$ . Evidentemente, la explosión tiene poca importancia. De hecho, nuestra fórmula general hace evidente que cuando $p_n^2$ es pequeño, la explosión apenas afectará a las posibilidades de ganar o empatar (aunque, por supuesto, puede afectar sensiblemente al valor esperado del dado). Por ejemplo, si $p_n$ es tan grande como $1/5$ La explosión multiplicará la posibilidad de un empate en aproximadamente $0.96$ apenas hay reducción.

2voto

aramis Puntos 111

Método tabular

Para dos dados, la forma más sencilla de hacerlo es hacer una cuadrícula bidimensional, y luego contar el número de resultados.

   A 1 2 3 4   Chances
 B ----------- Of 24
 1 | 1 2 3 4 | 1
 2 | 2 2 3 4 | 3
 3 | 3 3 3 4 | 5
 4 | 4 4 4 4 | 7
 5 | 5 5 5 5 | 4
 6 | 6 6 6 6 | 4

Uno puede desenvolver tal tabla en una segunda tabla...

   AB 1 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 6 6 6 6   Chances
 C   -------------------------------------------------- of 4*5*6
 1 |  1 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 6 6 6 6 | 1 (1-0)
 2 |  2 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 6 6 6 6 | 7 (8-1)
 3 |  3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 6 6 6 6 | 19 (27-16)
 4 |  4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 6 6 6 6 | 37 (64-27)
 5 |  5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 | 36 4*(25-16)
 6 |  6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 | 44 4*(36-25)
 7 |  7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | 24 
 8 |  8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 | 24 
   ---------------------------------------------------

Método de las fórmulas

Dado A B, y cualquier N A, las probabilidades de N sobre el mayor de 1dA y 1dB son (N^2)-((N-1)^2)/(A*B), y cualquier A

Para 3d, donde N A B C, las probabilidades de N son ((N^3)-((N-1)^3))/(A*B*C).
IIRC, Donde A < N B C, las probabilidades de N son A*((N^2)-((N-1)^2))/(A*B*C).
IIRC, donde A B < N C, las probabilidades de N son A*B/(A*B*C)

Para 4d, debería ser... N A B C D, chance(N)= ((N^4)-(N^3))/(A*B*C*D)
A N B C D, chance(N)= A*((N^3)-(N^2))/(A*B*C*D)
A B N C D, chance(N)= A*B*((N^2)-(N^1))/(A*B*C*D)
A B C N D, chance(N)= A*B*C/(A*B*C*D)

Y así sucesivamente...

Método programático

Es posible utilizar bucles for/next anidados. Proporcionaré un ejemplo en python, porque es barato, fácil y tiene herramientas ingeniosas como .sort()...

T = 0
R = [0,0,0,0,0,0,0,0,0,0,0] 
' R needs one more "0," than the largest number of sides
' we set up a for line for each die, with the possible results in the entries.
For A in [1,2,3,4]:
    for B in [1,2,3,4,5,6]:
        for C in [1,2,3,4,5,6,7,8]:
            for D in [1,2,3,4,5,6,7,8,9,10]:
                ' now we do actual work...
                temp = [0,0,0,0]
                ' reset temp
                temp[0]=A
                temp[1]=B
                temp[2]=C
                temp[3]=D
                ' we've just loaded the current die's values into array Temp
                temp.sort()
                ' we've just put them into order
                n = temp[3]
                ' we get the high die
                R[n] += 1
                ' we increment the count for a result of n
                T += 1
                ' we count the total iterations.
X = 0
' we're setting our output loop next, and it uses X as a counter
for Y in R:
    print X, Y
    ' print current entry labeled. 
    X += 1
    ' increment X

Se pueden utilizar métodos similares en muchos lenguajes, pero para este tipo de cálculos uso Python por sus arrays realmente robustos.

1 votos

Probablemente lo escribiste así por alguna razón, pero de todos modos, el código Python podría ser simplificado un poco o totalmente reescrito sin la anidación

0 votos

@Stuart La inteligibilidad humana es el motivo. Tu reducción es, aunque hábil, mucho menos inteligible para los programadores que no son del núcleo duro, y eso es contraproducente.

0 votos

Utilizando max(A, B, C, D) es menos inteligible que hacer una lista temporal de ceros, cambiar los ceros a las variables del bucle, ordenar la lista y tomar el valor más alto de ella?

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