Calculando as probabilidades de dados para um conjunto de dados d6 exclusivo

6

Estou tentando projetar um sistema único de pool de dados d6, e quero tentar programar as probabilidades no AnyDice, mas não sei como. Veja como o sistema funciona:

  • Os pools de dados têm entre 2 e 10 dados
  • Um teste de 5 ou 6 é um sucesso
  • Qualquer dado que soma 5 ou mais também conta como sucessos

Por exemplo, um teste de (6,3,2,3,5,4,3,1) seria 5 sucessos (1 de 6, 1 de 5, 1 de 3 + 2, 1 de 4 + 1 e 1 de 3 + 3).

Que tipo de programa no AnyDice ou no Excel eu usaria para calcular as probabilidades médias de cada pool de dados até 10 dados?

    
por Andinel 28.11.2014 / 19:54

3 respostas

Uma geração exaustiva das possibilidades pode ser feita.

Não é 100% claro o que você quer dizer com "dados totalizando pelo menos 5", eu escolhi interpretar isso como "soma até 5 dados" e isso significa que um teria pelo menos um sucesso com um pool de 5 ou mais dados (e pelo menos 2 sucessos com um conjunto de 10 dados).

Em princípio, o algoritmo é simples:

# interpret "roll a die" as "loop from 1 to 6 and for each..."
declare a tabulation function
declare a "generate all rolls" function, taking dice to roll and rolls so far
  if we should roll only one more dice:
    roll it, add it to the rolls so far, pass that to the tabulator
  otherwise:
    roll a die, add it to the rolls so far and call ourselves, generating one less roll

Depois, você pode tabular todo o número de sucessos diferentes. Até agora, tenho os resultados para pools de tamanho 2-9 e posso editar a entrada com os resultados.

    
01.12.2014 / 18:01

Isso é bem simples de calcular. Primeiro, existe uma chance de 1/3 de cada dado ser 5 ou 6. Então, você obterá (tamanho do pool de dados) / 3 sucessos para começar.

Depois disso, você precisa calcular quantos sucessos você recebe adicionando outros dados juntos. Já que todo resultado que não é 5 ou 6 será 1, 2, 3 ou 4, isso significa que suas jogadas que não são bem-sucedidas serão, em média, de 2,5. Isso significa que, em média, você obterá um sucesso para cada dois dados não bem-sucedidos. Como 2/3 dados não são bem-sucedidos, isso significa que obtemos, em média, (tamanho do conjunto de dados) / 3 sucessos disso também. (2/3 dividido por 2 é 1/3)

Então, no final, você receberá uma média de 2 sucessos para cada 3 dados lançados .

    
28.11.2014 / 20:19

Embora o @AgentPaper tenha fornecido uma fórmula muito interessante, a realidade é um pouco diferente.

Eu usei um pequeno script python para calcular o número médio de resultados em mais de 100.000 tentativas.

import random, math

rep = 100000
data =[]
for n in range(1,11):
    result = []
    for _ in range(rep):
        R = sorted([random.randint(1,6) for __ in range(n)])
        S = R.count(6)+R.count(5)
        R = R[:-S]
        while len(R)>1:
            # Take highest number in R
            x = R.pop(-1)           
            try:
                # Try to find lowest complement to 5.
                R.pop(next(R.index(i) for i in R if x+i>=5))
                S+=1
            except StopIteration:
                # No complement found? Put (highest+lowest) back into list.
                R.append(x+R.pop(0))                   
        result.append(S)

    avg = sum(result)/float(rep)
    dev = math.sqrt(sum([(result[i]-avg)**2 for i in range(rep)])/(rep-1))
    print('{}: {:.2f}+-{:.2f}'.format(n,avg,dev))

O resultado é a linha verde, completa com desvio padrão (do resultado único, não da média), a linha vermelha mostra 2/3 #dice para comparação.

Embora isso pareça estranho, como o AgentPaper não está incorreto em seus cálculos, acredito que o desvio é causado por dados que sobraram que não podem ser adicionados até 5.

Como apontado por Chris, em vez de rolar 100000 vezes aleatoriamente, você pode repetir todos os resultados possíveis. O número de tais resultados é 6 ^ n, o que significa que esse método leva algum tempo para n alto. Para fazer isso, você altera o código acima para usar o seguinte:

import random, math
from itertools import product

data =[]
for n in range(1,11):
    rep = 6**n
    result = []
    for r in product([1,2,3,4,5,6],repeat=n):
        R = sorted(list(r))
        S = R.count(6)+R.count(5)
[...]
    
28.11.2014 / 21:25

Tags