Função AnyDice para usar um dado como flip alto / baixo e crítico

5

Estou desenvolvendo um sistema de homebrew que utiliza 3d12 e estou querendo obter as probabilidades plotadas para que eu possa, por um lado, ver o quão viável esse sistema funcionaria e, dois, ser capaz de descobrir como habilidades e atributos podia funcionar. O objetivo do 3d12 é puramente temático, pois quase tudo gira em torno de tratar o "3" como um número sagrado no jogo.

Ainda estou aprendendo a utilizar o AnyDice. Eu havia emprestado uma função que encontrei on-line que foi projetada, originalmente, para rolar 2d6 e, em seguida, um lançamento de moeda, o resultado desse flip ser o resultado mais alto ou mais baixo.

Tentei imitá-lo, mas, para meus propósitos, estou tentando criar uma função que role o 3d12, mas um dos d12 é um dado decisivo semelhante à moeda. Se o dado decisivo for ímpar, você recebe o menor dos outros dois d12. Mesmo, você pega o mais alto.

Uma ressalva ao problema é como eu ligo para os críticos. Se os dois dados principais forem iguais (duplos), eles serão somados em vez de escolher o maior ou o menor. E se o dado decisivo também corresponder (triplos), isso conta como "crítico" e o terceiro dado também é adicionado.

A seguir está a função franken que tentei reunir do que encontrei on-line e através da documentação, mas sou claramente uma idiota porque costumava resolver; Agora, de alguma forma, consegui fazê-lo para que isso produza um erro de sintaxe:

function: well of DICE: d flip COIN: n {if (COIN = 1, 3, 5, 7, 9, 11) {resultado: [menor 1 de DICE]} resultado: [mais alto 1 de DICE]} loop N sobre {2..5} {saída [bem do Nd12 flip d12] chamado "[N] d12"} saída [bem do 2d12 flip d12] chamado "2d12 tendencioso"
por MetalcoreMonk 14.12.2016 / 21:31

2 respostas

O erro de sintaxe ocorre no AnyDice não (como idiomas da família C) quebra if condições em parens. De fato, sua sintaxe superficial é enganosa; compartilha muito pouco com esses idiomas. Além disso, para comparar com uma lista, você deve transformá-la em uma sequência com {}.

Você precisaria de uma função de invólucro também, para reificar os rolos individuais. (Diferentemente da maioria dos idiomas, o AnyDice pode facilmente ter variáveis ​​dentro de uma função que só pode ser tratada de maneira útil passando para outra função.) Aqui está como eu fiz isso com ajustes sugeridos por Ilmari Karonen.

function: H:n or L:n per COIN:n {
  if COIN = (COIN/2)*2 {
    R: H
  }
  else {
    R: L
  }
  if L = H {
    \ Doubles means keep both \
    R: L + H
    if L = COIN {
      \ Triples adds the decider die as well \
      R: R + COIN
    }
  }
  result: R
}

function: well of DICE:s flip COIN:n
{
  result: [[email protected] or [email protected] per COIN]
}

output [well of 2d12 flip d12] named "2d12 biased"
output [well of 2d12 flip 1] named "2d12 always lowest"
output [well of 2d12 flip 2] named "2d12 always highest"

As curvas gráficas são, é claro, de aparência bastante peculiar, mas acho que estão corretas. Existem quedas e solavancos correspondentes em que as mudanças de turnos duplos aumentam.

14.12.2016 / 22:07

Aqui está uma maneira mais simples para implementar esse mecânico no AnyDice:

função: combinar A: ne B: n usando C: n {se A = B & B = C {resultado: A + B + C} se A = B {resultado: A + B} se C = 2 * (C / 2) {resultado: [mais alto de A e B]} mais {resultado: [mais baixo de A e B]}} saída [combinar d12 e d12 usando d12]

O código deve ser bastante auto-explicativo, embora dependa de dois detalhes ligeiramente obscuros (mas bastante importantes) sobre como as funções do AnyDice funcionam:

  1. atribuindo qualquer coisa a resultar termina a função imediatamente e
  2. se uma função esperar um ou mais números como parâmetros (conforme marcado pelo :n após o nome do parâmetro) ser chamado com dados como esses parâmetros, a função será avaliada para todas as combinações possíveis dos dados, e os resultados serão ponderados (resultando em um novo dado inclinado) de acordo com a probabilidade de cada combinação.

Portanto, esse é o truque geral para avaliar os resultados de um lançamento de dados de maneiras incomuns no AnyDice: basta passar dados para uma função que espera um número (ou uma sequência) e descobrir o resultado do lançamento dentro da função.

(A C = 2 * (C / 2) também pode precisar de algumas explicações. O AnyDice não tem um operador restante / módulo como % em C, mas possui um operador de divisão inteira / que arredonda o resultado. Portanto, uma maneira fácil de verificar se um número é par é dividi-lo por 2, arredondando para baixo e depois multiplicá-lo por 2 e verificar se o resultado é igual ao número original.)


De qualquer forma, se você olhar para o gráfico dos resultados, você notará que a distribuição resultante está muito próxima de um simples lançamento do d12, e espera-se que haja uma pequena chance de o resultado ser duplicado e uma chance ainda menor de triplicar.

Na verdade, acontece que que a fórmula a seguir gera exatamente a mesma distribuição:

saída d12 * d {3, 2: 11, 1: (11 * 12)}

O d{3, 2:11, 1:(11*12)} O dado é um dado tendencioso que rola três com probabilidade 1 / 144, dois com probabilidade 11 / 144 e um com probabilidade 132 / 144. Essas são exatamente as probabilidades de lançar um "triplo crítico", um "crítico normal" e um não crítico no seu sistema.

Assim, o mecânico "mais alto se for par, mais baixo se for esquisito" efetivamente não faz diferença; somente os críticos distinguem seu sistema de um rolo 1d12 direto. De fato, se você remover os dois primeiros if declarações do combine A: ne B: n usando C: n função que eu dei acima, você verá que os resultados serão idênticos a um simples 1d12.

17.12.2016 / 01:35

Tags