¿Cómo determinar fácilmente la distribución de resultados para dados múltiples?


21

Quiero calcular la distribución de probabilidad para el total de una combinación de dados.

Recuerdo que la probabilidad de es el número de combinaciones que suman ese número sobre el número total de combinaciones (suponiendo que los dados tengan una distribución uniforme).

¿Cuáles son las fórmulas para

  • El número total de combinaciones.
  • El número de combinaciones que suman un número determinado.

1
Creo que deberías tratar (X1=1,X2=2) y (X1=2,X2=1) como eventos diferentes.
Deep North

Respuestas:


15

Soluciones exactas

El número de combinaciones en n tiros es, por supuesto, 6n .

Estos cálculos se realizan con mayor facilidad utilizando la función de generación de probabilidad para un dado,

p(x)=x+x2+x3+x4+x5+x6=x1x61x.

(En realidad, esto es 6 veces el pgf; me ocuparé del factor 6 al final).

El pgf para n rollos es p(x)n . Podemos calcular esto de manera bastante directa, no es una forma cerrada pero es útil, utilizando el teorema binomial:

p(x)n=xn(1x6)n(1x)n

=xn(k=0n(nk)(1)kx6k)(j=0(nj)(1)jxj).

El número de formas de obtener una suma igual a m en los dados es el coeficiente de xm en este producto, que podemos aislar como

6k+j=mn(nk)(nj)(1)k+j.

La suma está sobre todos los k y j no negativos para los cuales 6k+j=mn ; por lo tanto, es finito y solo tiene unos (mn)/6 términos. Por ejemplo, el número de formas de totalizar m=14 en n=3 lanzamientos es una suma de solo dos términos, porque 11=143 se puede escribir como 60+11 y 61+5 :

(30)(311)+(31)(35)

=1(3)(4)(13)11!+3(3)(4)(7)5!

=121213-326 67 7=15.

(También puede ser inteligente y observar que la respuesta será la misma para metro=7 7 por la simetría 1 <--> 6, 2 <--> 5 y 3 <--> 4 y solo hay una forma de expandirse 73 como 6k+j ; a saber, con k=0 y j=4 , dando

(30)(34)=15.

Por tanto, la probabilidad es igual a 15/63 = 5/36 , aproximadamente el 14%.

Para cuando esto se vuelve doloroso, el Teorema del límite central proporciona buenas aproximaciones (al menos a los términos centrales donde m está entre 7n23n y7n2+3n : en términos relativos, las aproximaciones que proporciona para los valores de cola empeoran cada vez más a medida quencrece).

Veo que esta fórmula se da en las referencias de Srikant del artículo de Wikipedia, pero no se proporciona justificación ni se dan ejemplos. Si acaso este enfoque parece demasiado abstracta, el fuego de su sistema de álgebra computacional favorita y pedir que se expanda el nth poder de x+x2++x6 : se puede leer todo el conjunto de valores de la derecha. Por ejemplo , una línea de Mathematica es

With[{n=3}, CoefficientList[Expand[(x + x^2 + x^3 + x^4 + x^5 + x^6)^n], x]]

¿Funcionará ese código matemático con Wolfram Alpha?

1
Eso funciona. Probé su versión anterior pero no pude entender la salida.

2
@Srikant: Expandir [Suma [x ^ i, {i, 1,6}] ^ 3] también funciona en WolframAlpha

1
@ A.Wilson Creo que muchas de esas referencias proporcionan un camino claro hacia la generalización, que en este ejemplo es . Si desea que el código calcule estas cosas, consulte stats.stackexchange.com/a/116913 para obtener un sistema completamente implementado. Como otro ejemplo, el código de Mathematica es(x+x2++x6)(x+x2+x3+x4)3RClear[x, d]; d[n_, x_] := Sum[x^i, {i, 1, n}]; d[6, x] d[4, x]^3 // Expand
whuber

1
Tenga en cuenta que la aclaración de @ whuber es para 1d6 + 3d4, y eso debería llevarlo allí. Para un wdn + vdm arbitrario, (x + x ^ 2 + ... + x ^ w) ^ n (x + x ^ 2 + ... + x ^ v) ^ m. Los términos adicionales son polinomios construidos y multiplicados con el producto de la misma manera.
A. Wilson

8

Otra forma de calcular rápidamente la distribución de probabilidad de una tirada de dados sería usar una calculadora especializada diseñada solo para ese propósito.

Torben Mogensen , profesor de CS en DIKU tiene un excelente lanzador de dados llamado Troll .

El rodillo de dados Troll y la calculadora de probabilidad imprime la distribución de probabilidad (pmf, histograma y opcionalmente cdf o ccdf), media, dispersión y desviación media para una variedad de mecanismos complicados de lanzamiento de dados. Aquí hay algunos ejemplos que muestran el lenguaje de tirada de dados de Troll:

Rollo de 3 dados de 6 lados y sumarlos: sum 3d6.

4 tirada de dados de 6 lados, mantener el más alto 3 y la suma de ellos: sum largest 3 4d6.

Rodar una "explosión" matriz 6 caras (es decir, cada vez que un "6" surge, añadir 6 a su total y rodar de nuevo): sum (accumulate y:=d6 while y=6).

El código fuente SML de Troll está disponible, si desea ver cómo se implementa.

El profesor Morgensen también tiene un documento de 29 páginas, " Mecanismos de lanzamiento de dados en juegos de rol ", en el que analiza muchos de los mecanismos de lanzamiento de dados implementados por Troll y algunas de las matemáticas detrás de ellos.

Una pieza similar de software gratuito de código abierto es Dicelab , que funciona tanto en Linux como en Windows.


7

Deje que el primer dado sea rojo y el segundo sea negro. Luego hay 36 resultados posibles:

12345611,11,21,31,41,51,623456722,12,22,32,42,52,634567833,13,23,33,43,53,645678944,14,24,34,44,54,6567891055,15,25,35,45,55,66789101166,16,26,36,46,56,6789101112

Each of these 36 (red,black) results are equally likely.

When you sum the numbers on the faces (total in blue), several of the (red,black) results end up with the same total -- you can see this with the table in your question.

So for example there's only one way to get a total of 2 (i.e. only the event (1,1)), but there's two ways to get 3 (i.e. the elementary events (2,1) and (1,2)). So a total of 3 is twice as likely to come up as 2. Similarly there's three ways of getting 4, four ways of getting 5 and so on.

Now since you have 36 possible (red,black) results, the total number of ways of getting all the different totals is also 36, so you should divide by 36 at the end. Your total probability will be 1, as it should be.


Wow, the table is beautiful!
Deep North

Very pretty indeed
wolfies

6

There's a very neat way of computing the combinations or probabilities in a spreadsheet (such as excel) that computes the convolutions directly.

I'll do it in terms of probabilities and illustrate it for six sided dice but you can do it for dice with any number of sides (including adding different ones).

(btw it's also easy in something like R or matlab that will do convolutions)

Start with a clean sheet, in a few columns, and move down a bunch of rows from the top (more than 6).

  1. put the value 1 in a cell. That's the probabilities associated with 0 dice. put a 0 to its left; that's the value column - continue down from there with 1,2,3 down as far as you need.

  2. move one column to the right and down a row from the '1'. enter the formula "=sum(" then left-arrow up-arrow (to highlight the cell with 1 in it), hit ":" (to start entering a range) and then up-arrow 5 times, followed by ")/6" and press Enter - so you end up with a formula like =sum(c4:c9)/6 (where here C9 is the cell with the 1 in it).

    enter image description here

    Then copy the formula and paste it to the 5 cells below it. They should each contain 0.16667 (ish).

    enter image description here

    Don't type anything into the empty cells these formulas refer to!

  3. move down 1 and to the right 1 from the top of that column of values and paste ...

    enter image description here

    ... a total of another 11 values. These will be the probabilities for two dice.

    enter image description here

    It doesn't matter if you paste a few too many, you'll just get zeroes.

  4. repeat step 3 for the next column for three dice, and again for four, five, etc dice.

    enter image description here

    We see here that the probability of rolling 12 on 4d6 is 0.096451 (if you multiply by 46 you'll be able to write it as an exact fraction).

If you're adept with Excel - things like copying a formula from a cell and pasting into many cells in a column, you can generate all tables up to say 10d6 in about a minute or so (possibly faster if you've done it a few times).


If you want combination counts instead of probabilities, don't divide by 6.

If you want dice with different numbers of faces, you can sum k (rather than 6) cells and then divide by k. You can mix dice across columns (e.g. do a column for d6 and one for d8 to get the probability function for d6+d8):

enter image description here


5

Approximate Solution

I explained the exact solution earlier (see below). I will now offer an approximate solution which may suit your needs better.

Let:

Xi be the outcome of a roll of a s faced dice where i=1,...n.

S be the total of all n dice.

X¯ be the sample average.

By definition, we have:

X¯=iXin

In other words,

X¯=Sn

The idea now is to visualize the process of observing Xi as the outcome of throwing the same dice n times instead of as outcome of throwing n dice. Thus, we can invoke the central limit theorem (ignoring technicalities associated with going from discrete distribution to continuous), we have as n:

X¯N(μ,σ2/n)

where,

μ=(s+1)/2 is the mean of the roll of a single dice and

σ2=(s21)/12 is the associated variance.

The above is obviously an approximation as the underlying distribution Xi has discrete support.

But,

S=nX¯.

Thus, we have:

SN(nμ,nσ2).

Exact Solution

Wikipedia has a brief explanation as how to calculate the required probabilities. I will elaborate a bit more as to why the explanation there makes sense. To the extent possible I have used similar notation to the Wikipedia article.

Suppose that you have n dice each with s faces and you want to compute the probability that a single roll of all n dice the total adds up to k. The approach is as follows:

Define:

Fs,n(k): Probability that you get a total of k on a single roll of n dices with s faces.

By definition, we have:

Fs,1(k)=1s

The above states that if you just have one dice with s faces the probability of obtaining a total k between 1 and s is the familiar 1s.

Consider the situation when you roll two dice: You can obtain a sum of k as follows: The first roll is between 1 to k1 and the corresponding roll for the second one is between k1 to 1. Thus, we have:

Fs,2(k)=i=1i=k1Fs,1(i)Fs,1(ki)

Now consider a roll of three dice: You can get a sum of k if you roll a 1 to k2 on the first dice and the sum on the remaining two dice is between k1 to 2. Thus,

Fs,3(k)=i=1i=k2Fs,1(i)Fs,2(ki)

Continuing the above logic, we get the recursion equation:

Fs,n(k)=i=1i=kn+1Fs,1(i)Fs,n1(ki)

See the Wikipedia link for more details.


@Srikant Excellent answer, but does that function resolve to something arithmetic (ie: not recursive)?
C. Ross

@C. Ross Unfortunately I do not think so. But, I suspect that the recursion should not be that hard as long as are dealing with reasonably small n and small s. You could just build-up a lookup table and use that repeatedly as needed.

1
The wikipedia page you linked has a simple nonrecursive formula which is a single sum. One derivation is in whuber's answer.
Douglas Zare

The wiki link anchor is dead, do you know of a replacement?
Midnighter

4

Las funciones características pueden hacer que los cálculos que involucran sumas y diferencias de variables aleatorias sean realmente fáciles. Mathematica tiene muchas funciones para trabajar con distribuciones estadísticas, incluida una función integrada para transformar una distribución en su función característica.

Me gustaría ilustrar esto con dos ejemplos concretos: (1) Suponga que desea determinar los resultados de lanzar una colección de dados con diferentes números de lados, por ejemplo, tirar dos dados de seis lados más un dado de ocho lados (es decir , 2d6 + d8 )? O (2) suponga que desea encontrar la diferencia de dos tiradas de dados (por ejemplo, d6-d6 )?

An easy way to do this would be to use the characteristic functions of the underlying discrete uniform distributions. If a random variable X has a probability mass function f, then its characteristic function φX(t) is just the discrete Fourier Transform of f, i.e., φX(t)=F{f}(t)=E[eitX]. A theorem tells us:

If the independent random variables X and Y have corresponding probability mass functions f and g, then the pmf h of the sum X+Y of these RVs is the convolution of their pmfs h(n)=(fg)(n)=m=f(m)g(nm).

We can use the convolution property of Fourier Transforms to restate this more simply in terms of characteristic functions:

The characteristic function φX+Y(t) of the sum of independent random variables X and Y equals the product of their characteristic functions φX(t)φY(t).

This Mathematica function will make the characteristic function for an s-sided die:

MakeCf[s_] := 
 Module[{Cf}, 
  Cf := CharacteristicFunction[DiscreteUniformDistribution[{1, s}], 
    t];
  Cf]

The pmf of a distribution can be recovered from its characteristic function, because Fourier Transforms are invertible. Here is the Mathematica code to do it:

RecoverPmf[Cf_] := 
  Module[{F}, 
    F[y_] := SeriesCoefficient[Cf /. t -> -I*Log[x], {x, 0, y}];
    F]

Continuing our example, let F be the pmf that results from 2d6+d8.

F := RecoverPmf[MakeCf[6]^2 MakeCf[8]]

There are 628=288 outcomes. The domain of support of F is S={3,,20}. Three is the min because you're rolling three dice. And twenty is the max because 20=26+8. If you want to see the image of F, compute

In:= F /@ Range[3, 20]

Out= {1/288, 1/96, 1/48, 5/144, 5/96, 7/96, 13/144, 5/48, 1/9, 1/9, \
5/48, 13/144, 7/96, 5/96, 5/144, 1/48, 1/96, 1/288}

If you want to know the number of outcomes that sum to 10, compute

In:= 6^2 8 F[10]

Out= 30

If the independent random variables X and Y have corresponding probability mass functions f and g, then the pmf h of the difference XY of these RVs is the cross-correlation of their pmfs h(n)=(fg)(n)=m=f(m)g(n+m).

We can use the cross-correlation property of Fourier Transforms to restate this more simply in terms of characteristic functions:

The characteristic function φXY(t) of the difference of two independent random variables X,Y equals the product of the characteristic function φX(t) and φY(t) (N.B. the negative sign in front of the variable t in the second characteristic function).

So, using Mathematica to find the pmf G of d6-d6:

G := RecoverPmf[MakeCf[6] (MakeCf[6] /. t -> -t)]

There are 62=36 outcomes. The domain of support of G is S={5,,5}. -5 is the min because 5=16. And 5 is the max because 61=5. If you want to see the image of G, compute

In:= G /@ Range[-5, 5]

Out= {1/36, 1/18, 1/12, 1/9, 5/36, 1/6, 5/36, 1/9, 1/12, 1/18, 1/36}

1
Of course, for discrete distributions, including distributions of finite support (like those in question here), the cf is just the probability generating function evaluated at x = exp(i t), making it a more complicated way of encoding the same information.
whuber

2
@whuber: As you say, the cf, mgf, and pgf are more-or-less the same and easily transformable into one another, however Mathematica has a cf builtin that works with all the probability distributions it knows about, whereas it doesn't have a pgf builtin. This makes the Mathematica code for working with sums (and differences) of dice using cfs particularly elegant to construct, regardless of the complexity of dice expression as I hope I demonstrated above. Plus, it doesn't hurt to know how cfs, FTs, convolutions, and cross-correlations can help solve problems like this.

1
@Elisha: Good points, all of them. I guess what I wonder about the most is whether your ten or so lines of Mathematica code are really more "elegant" or efficient than the single line I proposed earlier (or the even shorter line Srikant fed to Wolfram Alpha). I suspect the internal manipulations with characteristic functions are more arduous than the simple convolutions needed to multiply polynomials. Certainly the latter are easier to implement in most other software environments, as Glen_b's answer indicates. The advantage of your approach is its greater generality.
whuber

4

Aquí hay otra forma de calcular la distribución de probabilidad de la suma de dos dados a mano usando convoluciones.

Para mantener el ejemplo realmente simple, vamos a calcular la distribución de probabilidad de la suma de un dado de tres lados (d3) cuya variable aleatoria llamaremos X y un dado de dos lados (d2) cuya variable aleatoria vamos a llama a Y.

Vas a hacer una mesa. En la fila superior, escribe la distribución de probabilidad de X (resultados de tirar un d3 justo). Abajo de la columna izquierda, escriba la distribución de probabilidad de Y (resultados de tirar un d2 justo).

Vas a construir el producto externo de la fila superior de probabilidades con la columna izquierda de probabilidades. Por ejemplo, la celda inferior derecha será el producto de Pr [X = 3] = 1/3 veces Pr [Y = 2] = 1/2 como se muestra en la figura adjunta. En nuestro ejemplo simplista, todas las celdas equivalen a 1/6.

A continuación, sumarás a lo largo de las líneas oblicuas de la matriz del producto externo como se muestra en el diagrama adjunto. Cada línea oblicua pasa a través de una o más celdas que he coloreado igual: la línea superior pasa a través de una celda azul, la siguiente línea pasa a través de dos celdas rojas, y así sucesivamente.

alt text

Cada una de las sumas a lo largo de los oblicuos representa una probabilidad en la distribución resultante. Por ejemplo, la suma de los glóbulos rojos es igual a la probabilidad de que los dos dados sumen 3. La probabilidad se muestra en el lado derecho del diagrama adjunto.

Esta técnica se puede usar con dos distribuciones discretas con soporte finito. Y puedes aplicarlo iterativamente. Por ejemplo, si desea conocer la distribución de tres dados de seis lados (3d6), primero puede calcular 2d6 = d6 + d6; entonces 3d6 = d6 + 2d6.

Hay un lenguaje de programación libre (pero cerrada licencia) llamado J . Es un lenguaje basado en matriz con sus raíces en APL. Tiene operadores integrados para realizar productos externos y sumas a lo largo de los oblicuos en matrices, lo que hace que la técnica que ilustré sea bastante simple de implementar.

En el siguiente código J, defino dos verbos. Primero, el verbo dconstruye una matriz que representa el pmf de un dado s-sided. Por ejemplo, d 6es el pmf de un dado de 6 lados. Segundo, el verbo convencuentra el producto externo de dos matrices y sumas a lo largo de las líneas oblicuas. Entoncesconv~ d 6 prints out the pmf of 2d6:

d =: $%
conv =: + //. @ (* /)
|: (2 + i.11) ,: conv ~ d 6
 2 0.0277778
 3 0.0555556
 4 0.0833333
 5 0.111111
 6 0.138889
 7 0.166667
 8 0.138889
 9 0.111111
10 0.0833333
11 0.0555556
12 0.0277778

Como puede ver, J es críptico, pero conciso.


3

Esta es en realidad una pregunta sorprendentemente complicada. Afortunadamente para ti, existe una solución exacta que se explica muy bien aquí:

http://mathworld.wolfram.com/Dice.html

La probabilidad que está buscando está dada por la ecuación (10): "La probabilidad de obtener p puntos (una tirada de p) en n dados dados por los lados".

En su caso: p = la puntuación observada (suma de todos los dados), n = el número de dados, s = 6 (dados de 6 lados). Esto le da la siguiente función de masa de probabilidad:

P(Xn=p)=1snk=0(pn)/6(1)k(nk)(p6k1n1)

Welcome to our site, Felix!
whuber

1

Love the username! Well done :)

The outcomes you should count are the dice rolls, all 6×6=36 of them as shown in your table.

For example, 136 of the time the sum is 2, and 236 of the time the sum is 3, and 436 of the time the sum is 4, and so on.


Estoy realmente confundido por esto. ¡Respondí una pregunta de novato muy reciente de alguien llamado die_hard, que aparentemente ya no existe, luego encontré mi respuesta adjunta a este hilo antiguo!
Creosota

Your answer to the question at stats.stackexchange.com/questions/173434/… was merged with the answers to this duplicate.
whuber

1

Puedes resolver esto con una fórmula recursiva. En ese caso, las probabilidades de los rollos connorte los dados se calculan por los rollos con norte-1 dado.

unnorte(l)=l-6 6kl-1 y norte-1k6 6(norte-1)unnorte-1(k)

El primer límite para k en la suma son los seis números anteriores. Por ejemplo, si quieres tirar 13 con 3 dados, puedes hacerlo si tus dos primeros dados tiran entre 7 y 12.

El segundo límite para k en la suma son los límites de lo que puedes tirar con n-1 dados.

El resultado:

1 1 1  1  1   1
1 2 3  4  5   6   5  4   3   2   1
1 3 6  10 15  21  25 27  27  25  21  15  10  6    3   1
1 4 10 20 35  56  80 104 125 140 146 140 125 104  80  56  35  20  10   4   1
1 5 15 35 70 126 205 305 420 540 651 735 780 780 735 651 540 420 305 205 126 70 35 15 5 1  

editar: La respuesta anterior fue una respuesta de otra pregunta que fue combinada en la pregunta por C.Ross

El siguiente código muestra cómo se realizaron los cálculos para esa respuesta (a la pregunta que pide 5 dados) en R. Son similares a las sumas realizadas en Excel en la respuesta de Glen B.

# recursive formula
nextdice <- function(n,a,l) {
  x = 0
  for (i in 1:6) {
    if ((l-i >= n-1) & (l-i<=6*(n-1))) {
      x = x+a[l-i-(n-2)]
    }
  }
  return(x)  
}  

# generating combinations for rolling with up to 5 dices
a_1 <- rep(1,6)
a_2 <- sapply(2:12,FUN = function(x) {nextdice(2,a_1,x)})
a_3 <- sapply(3:18,FUN = function(x) {nextdice(3,a_2,x)})
a_4 <- sapply(4:24,FUN = function(x) {nextdice(4,a_3,x)})
a_5 <- sapply(5:30,FUN = function(x) {nextdice(5,a_4,x)})

@user67275 your question got merged into this question. But I wonder what your idea was behind your formula: "I used the formula: no of ways to get 8: 5_H_2 = 6_C_2 = 15" ?
Sextus Empiricus

1

One approach is to say that the probability Xn=k is the coefficient of xk in the expansion of the generating function

(x6+x5+x4+x3+x2+x16)n=(x(1x6)6(1x))n

So for example with six dice and a target of k=22, you will find P(X6=22)=1066. That link (to a math.stackexchange question) gives other approaches too

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.