Como determinar facilmente a distribuição de resultados para vários dados?


21

Quero calcular a distribuição de probabilidade para o total de uma combinação de dados.

Lembro que a probabilidade de é o número de combinações que totalizam esse número sobre o número total de combinações (supondo que os dados tenham uma distribuição uniforme).

Quais são as fórmulas para

  • O número total de combinações
  • O número de combinações que totalizam um determinado número

1
Eu acho que você deve tratar e como eventos diferentes. (X1=1,X2=2)(X1=2,X2=1)
Deep North

Respostas:


15

Soluções exatas

O número de combinações em jogadas é obviamente .n6n

Esses cálculos são feitos com maior facilidade usando a função de geração de probabilidade para um dado,

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

(Na verdade, isso é vezes o pgf - cuidarei do fator no final.)66

O pgf para rolos é . Podemos calcular isso diretamente - não é um formulário fechado, mas é útil - usando o Teorema Binomial:np(x)n

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

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

O número de maneiras de obter uma soma igual a nos dados é o coeficiente de neste produto, que podemos isolar comomxm

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

A soma é sobre todos os não-negativos e para os quais ; portanto, é finito e possui apenas cerca de termos. Por exemplo, o número de maneiras de totalizar em jogadas é uma soma de apenas dois termos, porque pode ser escrito apenas como e :kj6k+j=mn(mn)/6m=14n=311=14360+1161+5

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

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

=121213-3267=15

(Você também pode ser inteligente e observar que a resposta será a mesma para pela simetria 1 <--> 6, 2 <--> 5 e 3 <--> 4 e só há uma maneira de expandir como , ou seja, com e , dandom=77-36k+jk=0 0j=4

(30 0)(-34)=15.

Portanto, a probabilidade é igual a = , cerca de 14%.15/635/36.

Quando isso fica doloroso, o Teorema do Limite Central fornece boas aproximações (pelo menos para os termos centrais em que está entre e : em uma base relativa, as aproximações que ele oferece para os valores de cauda pioram cada vez mais à medida que cresce).m7n23n7n2+3nn

Vejo que essa fórmula é dada no artigo da Wikipedia, Srikant, mas não há justificativa, nem exemplos. Se por acaso essa abordagem parecer muito abstrata, inicie o sistema de álgebra de seu computador favorito e peça para expandir o poder de : você pode ler todo o conjunto de valores imediatamente. Por exemplo , um one-liner do Mathematica énthx+x2++x6

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

Esse código mathematica funcionará com o wolfram alpha?

1
Isso funciona. Eu tentei sua versão anterior, mas não conseguia entender a saída.

2
@Srikant: Expand [Sum [x ^ i, {i, 1,6}] ^ 3] também funciona em WolframAlpha

1
@ A.Wilson Eu acredito que muitas dessas referências fornecem um caminho claro para a generalização, que neste exemplo é . Se você deseja que o código calcule essas coisas, consulte stats.stackexchange.com/a/116913 para obter um sistema totalmente implementado. Como outro exemplo, o código do Mathematica é(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
Observe que o esclarecimento do @ whuber é para 1d6 + 3d4, e isso deve levá-lo até lá. Para um wdn arbitrário + vdm, (x + x ^ 2 + ... + x ^ w) ^ n (x + x ^ 2 + ... + x ^ v) ^ m. Termos adicionais são polinômios construídos e multiplicados com o produto da mesma maneira.
A. Wilson

8

Ainda outra maneira de calcular rapidamente a distribuição de probabilidade de um lançamento de dados seria usar uma calculadora especializada projetada apenas para esse fim.

Torben Mogensen , professor de CS na DIKU, possui um excelente rolador de dados chamado Troll .

O rolo de dados Troll e a calculadora de probabilidade imprimem a distribuição de probabilidade (pmf, histograma e opcionalmente cdf ou ccdf), média, spread e desvio médio para uma variedade de mecanismos complicados de lançamento de dados. Aqui estão alguns exemplos que mostram a linguagem dos dados de Troll:

Role 3 dados de 6 lados e resumi-los: sum 3d6.

Rolar dados 4 6 lados, manter a mais alta 3 e resumi-los: sum largest 3 4d6.

Rolar uma "explosão" die 6 lados (ou seja, sempre que um "6" trata-se, adicione 6 ao seu total and roll de novo): sum (accumulate y:=d6 while y=6).

O código-fonte SML da Troll está disponível, se você quiser ver como é implementado.

O professor Morgensen também tem um artigo de 29 páginas, " Mecanismos de Rolagem de Dados em RPGs ", no qual ele discute muitos dos mecanismos de rolagem de dados implementados por Troll e algumas das matemáticas por trás deles.

Uma peça similar de software livre e de código aberto é o Dicelab , que funciona tanto no Linux quanto no Windows.


7

Deixe o primeiro dado ser vermelho e o segundo preto. Existem 36 resultados possíveis:

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

Cada um desses resultados 36 ( ) é igualmente provável.red,black

Quando você soma os números nas faces (total em ), vários dos resultados (vermelho, preto) terminam com o mesmo total - você pode ver isso na tabela da sua pergunta.blue

Portanto, por exemplo, há apenas uma maneira de obter um total de ( por exemplo, apenas o evento ( )), mas há duas maneiras de obter (por exemplo, os eventos elementares ( ) e ( )). Portanto, um total de tem duas vezes mais chances de aparecer que . Da mesma forma, existem três maneiras de obter , quatro maneiras de obter e assim por diante.1 , 1 3 2 , 1 1 , 2 3 2 4 521,132,11,23245

Agora que você tem 36 resultados possíveis (vermelho, preto), o número total de maneiras de obter todos os totais diferentes também é 36, portanto, você deve dividir por 36 no final. Sua probabilidade total será 1, como deveria ser.


Uau, a mesa é linda!
Deep North

Muito bonita de fato
wolfies

6

Há uma maneira muito clara de calcular as combinações ou probabilidades em uma planilha (como o Excel) que calcula diretamente as convoluções.

Vou fazer isso em termos de probabilidades e ilustrá-lo por dados de seis lados, mas você pode fazê-lo por dados com qualquer número de lados (incluindo a adição de diferentes).

(btw também é fácil em algo como R ou matlab que fará convoluções)

Comece com uma planilha limpa, em algumas colunas, e desça várias linhas da parte superior (mais de 6).

  1. coloque o valor 1 em uma célula. Essas são as probabilidades associadas a 0 dado. coloque um 0 à sua esquerda; essa é a coluna do valor - continue a partir daí com 1,2,3 abaixo, na medida do necessário.

  2. mova uma coluna para a direita e desça uma linha do '1'. insira a fórmula "= soma (" seta para cima seta para a esquerda (para destacar a célula com 1), pressione ":" (para começar a inserir um intervalo) e seta para cima 5 vezes, seguida por ") / 6 "e pressione Enter - para que você acabe com uma fórmula como =sum(c4:c9)/6 (onde C9está a célula com o 1 nela).

    insira a descrição da imagem aqui

    Em seguida, copie a fórmula e cole-a nas 5 células abaixo dela. Cada um deles deve conter 0,16666 (ish).

    insira a descrição da imagem aqui

    Não digite nada nas células vazias às quais essas fórmulas se referem!

  3. mova para baixo 1 e para a direita 1 a partir do topo dessa coluna de valores e cole ...

    insira a descrição da imagem aqui

    ... um total de outros 11 valores. Essas serão as probabilidades de dois dados.

    insira a descrição da imagem aqui

    Não importa se você colar um pouco demais, obterá zeros.

  4. repita o passo 3 para a coluna seguinte por três dados e novamente por quatro, cinco, etc.

    insira a descrição da imagem aqui

    Vemos aqui que a probabilidade de rolar em 4d6 é 0,096451 (se você multiplicar por poderá escrevê-lo como uma fração exata).4 61246

Se você é adepto do Excel - coisas como copiar uma fórmula de uma célula e colar em muitas células de uma coluna, pode gerar todas as tabelas até 10d6 em cerca de um minuto (possivelmente mais rápido se você tiver feito isso poucas vezes).


Se você deseja contagens de combinações em vez de probabilidades, não divida por 6.

Se você quer dados com diferentes números de faces, pode somar (em vez de 6) células e depois dividir por . Você pode misturar dados entre colunas (por exemplo, faça uma coluna para d6 e uma para d8 para obter a função de probabilidade para d6 + d8):kkk

insira a descrição da imagem aqui


5

Solução Aproximada

Expliquei a solução exata anteriormente (veja abaixo). Agora vou oferecer uma solução aproximada que pode atender melhor às suas necessidades.

Deixei:

s i = 1 , . . . nXi é o resultado de um lançamento de um dado enfrentado onde .si=1,...n

nS = total de todos os dados.n

X¯ é a média da amostra.

Por definição, temos:

X¯=iXin

Em outras palavras,

X¯=Sn

A idéia agora é visualizar o processo de observar como o resultado de jogar o mesmo dado vezes, em vez de como o resultado de jogar dados. Assim, podemos invocar o teorema do limite central (ignorando os aspectos técnicos associados à passagem da distribuição discreta para a contínua), temos como : nnnXinnn

X¯N(μ,σ2/n)

Onde,

μ=(s+1)/2 é a média do lançamento de um único dado e

σ2=(s21)/12 é a variação associada.

O exposto acima é obviamente uma aproximação, pois a distribuição subjacente possui suporte discreto.Xi

Mas,

S=nX¯ .

Assim, temos:

SN(nμ,nσ2) .

Solução exata

A Wikipedia tem uma breve explicação sobre como calcular as probabilidades necessárias. Vou elaborar um pouco mais sobre por que a explicação lá faz sentido. Na medida do possível, usei notação semelhante ao artigo da Wikipedia.

Suponha que você tenha dados cada um com faces e deseje calcular a probabilidade de que um único lançamento de todos os dados do total totalize . A abordagem é a seguinte:nsnk

Definir:

Fs,n(k) : probabilidade de obter um total de em um único rolo de dados com faces.kns

Por definição, temos:

Fs,1(k)=1s

O texto acima afirma que se você tiver apenas um dado com , a probabilidade de obter um total entre 1 e s é o familiar .sk1s

Considere a situação ao jogar dois dados: Você pode obter uma soma de seguinte maneira: O primeiro lançamento está entre 1 e e o rolo correspondente para o segundo está entre e . Assim, temos:kk1k11

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

Agora considere um lançamento de três dados: você pode obter uma soma de se rolar de 1 a no primeiro dado e a soma dos dois dados restantes estiver entre e . Portanto,kk2k12

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

Continuando a lógica acima, obtemos a equação de recursão:

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

Veja o link da Wikipedia para mais detalhes.


Excelente resposta, mas essa função resolve algo aritmético (ou seja: não recursivo)?
C. Ross

@C. Ross Infelizmente, acho que não. Suspeito, porém, que a recursão não deva ser tão difícil enquanto estiver lidando com n e s razoavelmente pequenos. Você pode criar uma tabela de pesquisa e usá-la repetidamente, conforme necessário.

1
A página da wikipedia que você vinculou possui uma fórmula não-recursiva simples, que é uma soma única. Uma derivação está na resposta do whuber.
Douglas Zare

A âncora do link da wiki está morta, você sabe de uma substituição?
Midnighter

4

Funções características podem facilitar a computação envolvendo somas e diferenças de variáveis ​​aleatórias . O Mathematica tem muitas funções para trabalhar com distribuições estatísticas, incluindo um built-in para transformar uma distribuição em sua função característica.

Gostaria de ilustrar isso com dois exemplos concretos: (1) Suponha que você queira determinar os resultados de rolar uma coleção de dados com diferentes números de lados, por exemplo, rolar dois dados de seis lados mais um dado de oito lados (ou seja, , 2d6 + d8 )? Ou (2) suponha que você queira encontrar a diferença de dois lançamentos de dados (por exemplo, d6-d6 )?

Uma maneira fácil de fazer isso seria usar as funções características das distribuições uniformes discretas subjacentes. Se uma variável aleatória tem uma função de massa de probabilidade , então sua função característica é apenas a Transformada de Fourier discreta de , ou seja, . Um teorema nos diz:X fφX(t)fφX(t)=F{f}(t)=E[eitX]

Se as variáveis ​​aleatórias independentes e têm funções de massa de probabilidade correspondentes e , então o pmf da soma desses RVs é a convolução de seus pmfs .XYfghX+Yh(n)=(fg)(n)=m=f(m)g(nm)

Podemos usar a propriedade de convolução das transformadas de Fourier para reafirmar isso mais simplesmente em termos de funções características:

A função característica da soma das variáveis ​​aleatórias independentes e é igual ao produto de suas funções características .φX+Y(t)XYφX(t)φY(t)

Essa função do Mathematica fará a função característica de um dado de face:

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

O pmf de uma distribuição pode ser recuperado de sua função característica, porque as transformadas de Fourier são invertíveis. Aqui está o código do Mathematica para fazer isso:

RecoverPmf [Cf_]: = 
  Módulo [{F}, 
    F [y_]: = Coeficiente de série [Cf /. t -> -I * Log [x], {x, 0, y}];
    F]

Continuando nosso exemplo, seja F o pmf resultante de 2d6 + d8.

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

Existem resultados. O domínio de suporte de F é . Três é o mínimo, porque você está jogando três dados. E vinte é o máximo porque . Se você quiser ver a imagem de F, calcule628=288S={3,,20}20=26+8

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

Saída = {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}

Se você quiser saber o número de resultados que somam 10, calcule

Em: = 6 ^ 2 8 F [10]

Out = 30

Se as variáveis ​​aleatórias independentes e têm funções de massa de probabilidade correspondentes e , então o pmf da diferença desses RVs é a correlação cruzada de seus pmfs .XYfghXYh(n)=(fg)(n)=m=f(m)g(n+m)

Podemos usar a propriedade de correlação cruzada das transformadas de Fourier para reafirmar isso mais simplesmente em termos de funções características:

A função característica da diferença de duas variáveis ​​aleatórias independentes é igual ao produto da função característica e ( NB o sinal negativo na frente da variável t na segunda função característica).φXY(t)X,YφX(t)φY(t)

Portanto, usando o Mathematica para encontrar o pmf G de d6-d6:

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

Existem resultados. O domínio de suporte de G é . -5 é o mínimo porque . E 5 é o máximo porque . Se você quiser ver a imagem de G, calcule62=36S={5,,5}5=1661=5

Em: = Intervalo G / @ [-5, 5]

Saída = {1/36, 1/18, 1/12, 1/9, 5/36, 1/6, 5/36, 1/9, 1/12, 1/18, 1/36}

1
Obviamente, para distribuições discretas, incluindo distribuições de suporte finito (como as que estão em questão aqui), o cf é apenas a função geradora de probabilidade avaliada em x = exp (it), tornando-a uma maneira mais complicada de codificar as mesmas informações.
whuber

2
@whuber: Como você diz, cf, mgf e pgf são mais ou menos iguais e facilmente se transformam um no outro, no entanto, o Mathematica possui um cf embutido que funciona com todas as distribuições de probabilidade que conhece, embora não não tem um pgf embutido. Isso torna o código do Mathematica para trabalhar com somas (e diferenças) de dados usando cfs particularmente elegantes de construir, independentemente da complexidade da expressão de dados, como espero ter demonstrado acima. Além disso, não é demais saber como cfs, FTs, convoluções e correlações cruzadas podem ajudar a resolver problemas como esse.

1
@Elisha: Bons pontos, todos eles. Acho que o que mais me pergunto é se suas dez ou mais linhas de código do Mathematica são realmente mais "elegantes" ou eficientes do que a única linha que propus anteriormente (ou a linha ainda mais curta que Srikant forneceu ao Wolfram Alpha). Suspeito que as manipulações internas com funções características sejam mais árduas do que as simples convoluções necessárias para multiplicar polinômios. Certamente, os últimos são mais fáceis de implementar na maioria dos outros ambientes de software, como indica a resposta de Glen_b. A vantagem da sua abordagem é sua maior generalidade.
whuber

4

Aqui está outra maneira de calcular a distribuição de probabilidade da soma de dois dados manualmente, usando convoluções.

Para manter o exemplo realmente simples, vamos calcular a distribuição de probabilidade da soma de um dado de três lados (d3) cuja variável aleatória chamaremos de X e um dado de dois lados (d2) cuja variável aleatória ligue para Y.

Você vai fazer uma mesa. Na linha superior, escreva a distribuição de probabilidade de X (resultados de rolar um d3 razoável). Na coluna da esquerda, escreva a distribuição de probabilidade de Y (resultados de rolar um d2 justo).

Você construirá o produto externo da linha superior de probabilidades com a coluna esquerda de probabilidades. Por exemplo, a célula inferior direita será o produto de Pr [X = 3] = 1/3 vezes Pr [Y = 2] = 1/2, conforme mostrado na figura anexa. No nosso exemplo simplista, todas as células são iguais a 1/6.

Em seguida, você somará ao longo das linhas oblíquas da matriz do produto externo, conforme mostrado no diagrama anexo. Cada linha oblíqua passa por uma ou mais células com a mesma cor: a linha superior passa por uma célula azul, a próxima linha passa por duas células vermelhas e assim por diante.

texto alternativo

Cada uma das somas ao longo dos oblíquos representa uma probabilidade na distribuição resultante. Por exemplo, a soma das células vermelhas é igual à probabilidade dos dois dados serem somados a 3. Essas probabilidades são mostradas no lado direito do diagrama que o acompanha.

Essa técnica pode ser usada com duas distribuições discretas com suporte finito. E você pode aplicá-lo iterativamente. Por exemplo, se você deseja conhecer a distribuição de três dados de seis lados (3d6), primeiro pode calcular 2d6 = d6 + d6; então 3d6 = d6 + 2d6.

Não é uma linguagem de programação livre (mas fechado licença) chamado J . É uma linguagem baseada em array com raízes no APL. Possui operadores internos para executar produtos externos e somas ao longo dos oblíquos das matrizes, tornando a técnica que ilustrei bastante simples de implementar.

No código J a seguir, defino dois verbos. Primeiro, o verbo dconstrói uma matriz que representa o pmf de um dado de face dupla. Por exemplo, d 6é o pmf de um dado de 6 lados. Segundo, o verbo convencontra o produto externo de duas matrizes e somas ao longo das linhas oblíquas. Então, conv~ d 6imprime o pmf de 2d6:

d =: $%
conv =: + //. @ (* /)
|: (2 + i.11),: conv ~ d 6
 2 0,0277778
 3 0,0555556
 4 0,0833333
 5 0,1111111
 6 0,138889
 7 0,166667
 8 0,138889
 9 0,1111111
10 0,0833333
11 0,0555556
12 0,0277778

Como você pode ver, J é enigmático, mas conciso.


3

Esta é realmente uma pergunta surpreendentemente complicada. Felizmente para você, existe uma solução exata que é muito bem explicada aqui:

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

A probabilidade que você está procurando é dada pela equação (10): "A probabilidade de obter p pontos (um rolo de p) em dados de n lados".

No seu caso: p = a pontuação observada (soma de todos os dados), n = o número de dados, s = 6 (dados de 6 lados). Isso fornece a seguinte função de massa de probabilidade:

P(Xn=p)=1snk=0 0(p-n)/6(-1)k(nk)(p-6k-1n-1)

Bem-vindo ao nosso site, Felix!
whuber

1

Ame o nome de usuário! Bem feito :)

6×6=36.

136.2236.3436.4


Estou realmente confuso com isso. Respondi a uma pergunta recente de novato de alguém chamado die_hard, que aparentemente não existe mais, depois encontrei minha resposta anexada a esse tópico antigo!
Creosote

Sua resposta para a pergunta em stats.stackexchange.com/questions/173434/… foi mesclada com as respostas para essa duplicata.
whuber

1

nn-1

an(l)=l6kl1 and n1k6(n1)an1(k)

O primeiro limite para k na soma são os seis números anteriores. Por exemplo, se você quiser rolar 13 com 3 dados, poderá fazê-lo se seus dois primeiros dados rolarem entre 7 e 12.

O segundo limite para k no somatório é o limite do que você pode rolar com dados n-1

O 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  

edit: A resposta acima foi uma resposta de outra pergunta que foi mesclada à pergunta por C.Ross

O código abaixo mostra como os cálculos para essa resposta (para a pergunta que pede 5 dados) foram realizados em R. Eles são semelhantes aos somatórios realizados no Excel na resposta 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 sua pergunta foi mesclada a esta pergunta. Mas eu me pergunto qual foi sua ideia por trás da sua fórmula: "Eu usei a fórmula: não há maneiras de obter 8: 5_H_2 = 6_C_2 = 15" ?
Sextus Empiricus

1

Xn=kxk

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

k=22P(X6=22)=1066

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.