Help Modeling 5e Stat “Party Draft Pool” em Anydice

9

Estou procurando modelar um substituto para o mecanismo "4d6, drop the lowest" para determinar os valores de habilidade.

O sistema proposto funciona da seguinte forma:

  1. 4 jogadores rolam 4d6, soltam o menor x 6 [total de 24].
  2. Combine esses resultados em um pool de estatísticas.
  3. Os jogadores então jogam a iniciativa (1d20).
  4. Os jogadores selecionam estatísticas em "ordem de cobra" [1,2,3,4,4,3,2,1,1,2 ...]
  5. Os jogadores atribuem estatísticas às pontuações de habilidades conforme desejado.

(Eu estou pensando que esta é uma boa maneira de se divertir rolando dados sem os problemas de equilíbrio entre partes de 4d6, drop 1).

Obviamente, para modelagem, isso pode ser simplificado:

  1. Rolo 24 d [maior 3 de 4d6]
  2. Classifique os dados
  3. Execute o Loop Player 1..4 e atribua valores por "ordem de cobra", supondo que a disponibilidade mais alta esteja sempre selecionada
  4. Saída de 6 habilidades por jogador (ou apenas jogador 1 contra jogador 4)

Como eu modelo a distribuição de probabilidade acima em Anydice? Estou ficando preso na sintaxe.

    
por chazman 11.04.2018 / 22:36

3 respostas

No geral, isso parece beneficiar o primeiro jogador, mas depende de como você o mede.

Eu pensei em modelar isso programaticamente, pois será um pouco mais flexível do que usar o AnyDice. Eu escrevi um script que realiza o processo um grande número de vezes e calcula a média dos valores para cada jogador.

A principal dificuldade aqui é como você realmente interpreta os dados: o que faz com que um array de habilidades seja melhor que outro? Existem várias maneiras de julgar isso. Vou incluir alguns valores para métodos diferentes.

Total de todas as pontuações de habilidades
Jogador 1 tem valor médio de pontuação de habilidade 72.95522.
O jogador 2 tem um valor médio de pontuação de habilidade 73.43975.
O jogador 3 tem o valor médio de pontuação de habilidade 73.64131.
O jogador 4 tem um valor médio de pontuação de habilidade 73.72761.
Veredicto: Posteriormente, na ordem, é melhor

Total de todas as pontuações de habilidades, exceto a mais baixa
Jogador 1 tem valor médio de pontuação de habilidade 66.49585.
Jogador 2 tem valor médio de pontuação de habilidade 65.71347.
O jogador 3 tem um valor médio de pontuação de habilidade 65.10333.
O jogador 4 tem um valor médio de pontuação de habilidade de 64,57315.
Veredicto: Ser mais cedo na ordem é melhor

O total de pontos compra o custo de todas as pontuações de habilidade
(Eu usei pontos inventados para comprar números para números fora do intervalo permitido normal: 18 = 19, 17 = 15, 16 = 12, 6-7 = -1, 4-5 = -2, 3 = -1)
Jogador 1 tem valor médio de pontuação de habilidade 33.43838.
O jogador 2 tem um valor médio de pontuação de habilidade 31.80692.
O jogador 3 tem um valor médio de pontuação de habilidade de 31,00389.
O jogador 4 tem um valor médio de pontuação de habilidade de 30,64647.
Veredicto: Ser mais cedo na ordem é melhor

O total de pontos compra o custo de todas as pontuações de habilidade, exceto a mais baixa
Jogador 1 tem valor médio de pontuação de habilidade 34,33727.
O jogador 2 tem um valor médio de pontuação de habilidade de 31.88918.
O jogador 3 tem um valor médio de pontuação de habilidade de 30,39722.
O jogador 4 tem um valor médio de pontuação de habilidade de 29.45149.
Veredicto: Ser mais cedo na ordem é muito melhor

Eu incluí meu horrível código amador aqui para que você possa testá-lo.

#!/usr/bin/perl

use strict;
use warnings;
use List::Util qw(sum);
use Data::Dumper;
use POSIX;
use 5.010;

my $die_size = 6;
my $number_of_dice = 4;
my $number_of_players = 4;
my $number_of_runs = 10000;

sub get_single_ability_score {
    my @rolls;
    for (1..$number_of_dice) {
        my $roll = 1 + int rand($die_size);
        push @rolls, $roll;
    }
    @rolls = sort {$a <=> $b} @rolls;
    for (1..$number_of_dice - 3) {
        shift @rolls;
    }
    my $ability_score = sum(@rolls);
    return $ability_score;
}

sub get_total_values {
    my @group_ability_scores;
    for (1..$number_of_players * 6) {
        push @group_ability_scores, get_single_ability_score();
    }
    @group_ability_scores = sort { $b <=> $a } @group_ability_scores;
    my @player_order = (1..$number_of_players);
    my @reverse_player_order = sort { $b <=> $a } @player_order;
    @player_order = (@player_order, @reverse_player_order, @player_order, @reverse_player_order, @player_order, @reverse_player_order);
    my @player_ability_scores;
    foreach my $player (@player_order) {
        my @ability_scores;
        my $chosen_ability_score = shift @group_ability_scores;
        push @ability_scores, $chosen_ability_score;
        push @{ $player_ability_scores[$player-1] }, @ability_scores;
    }
    my @total_values;
    foreach my $player (1..$number_of_players) {
        my @ability_scores = sort { $a <=> $b } @{ $player_ability_scores[$player-1] };
        my $total_value = 0;
        shift @ability_scores; # One dump stat is fine so discard the lowest ability score
        foreach my $ability_score (@ability_scores) {
            #$total_value += $ability_score;                    # Uses the score as the value
            #$total_value += floor(($ability_score - 10) / 2);  # Uses the modifier as the value
            given ($ability_score) {
                when ($_ == 18) {$total_value += 19}
                when ($_ == 17) {$total_value += 15}
                when ($_ == 16) {$total_value += 12}
                when ($_ == 15) {$total_value +=  9}
                when ($_ == 14) {$total_value +=  7}
                when ($_ == 13) {$total_value +=  5}
                when ($_ == 12) {$total_value +=  4}
                when ($_ == 11) {$total_value +=  3}
                when ($_ == 10) {$total_value +=  2}
                when ($_ ==  9) {$total_value +=  1}
                when ($_ ==  8) {$total_value +=  0}
                when ($_ ==  7) {$total_value += -1}
                when ($_ ==  6) {$total_value += -2}
                when ($_ ==  5) {$total_value += -3}
                when ($_ ==  4) {$total_value += -4}
                when ($_ ==  3) {$total_value += -5}
            }
        }
        push @total_values, $total_value;
    }
    return @total_values;
}

my @all_values;
for (1..$number_of_runs) {
    my @total_values = get_total_values();
    foreach my $player (1..$number_of_players) {
        push @{ $all_values[$player-1] }, $total_values[$player-1];
    }
}

for my $player (1..$number_of_players) {
    my $total_value;
    foreach my $value (@{ $all_values[$player-1] }) {
        $total_value += $value;
    }
    my $mean_value = $total_value / $number_of_runs;
    print "Player $player has mean ability score value $mean_value.\n";
}

Experimente online!

    
13.04.2018 / 15:30

Depois de um pouco de finagling, eu escrevi um cálculo anydice que deve produzir a distribuição de probabilidade de o maior valor absoluto de habilidade deste método. Infelizmente, ele não é executado em anydice.com devido a um baixo limite de tempo de execução; Eu não sei se existe um equivalente local que poderia ser permitido correr mais e obter esses resultados.

Se é possível executar com muito mais eficiência ou tempo de execução, este cálculo deve produzir gráficos de probabilidade para as pontuações mais altas e totais de cada jogador. Gráficos semelhantes podem ser produzidos para o segundo mais alto, o terceiro mais alto, etc.

Embora, como mencionei, não tenha conseguido executar todos esses cálculos, alguns pontos são imediatamente óbvios. Primeiro: o jogador 1 sempre terá a "estatística primária" mais alta, mas a "estatística secundária" mais baixa, bem como a maior variação entre as estatísticas mais alta e mais baixa. Isso levaria o Jogador 1 a ter o melhor desempenho em uma classe em que sua estatística primária é praticamente tudo que eles precisam. Por outro lado, o Player 4 teria o stat primário lowest e o stat secundário highest , bem como a variância mais baixa entre as estatísticas mais altas e mais baixas, com melhor desempenho em qualquer classe com seus dois melhores atributos muito próximos em importância e / ou onde seu status de dump precisa ser um pouco maior do que terrível. Os jogadores 2 e 3 estariam entre eles.

De modo geral, eu diria que o jogador 1 tira o melhor proveito disso; o primeiro e o terceiro mais alto stats são os melhores, com o segundo melhor no low end, enquanto o Player 4 tem o pior e o pior, o segundo maior parece dificilmente compensar isso. Isso pode ser subjetivo, mas para mim há uma lacuna muito grande entre os valores das 3 e 3 maiores pontuações de habilidade, então o Jogador 4 com as 4ª e 6ª maiores pontuações quase não tem impacto na minha opinião.

Finalmente, em uma tentativa de obter alguns gráficos úteis, fiz uma simulação mais simples apenas para a "estatística mais alta". Primeiro eu tentei verificar as distribuições para algumas alternativas. O que mais estreitamente acabou combinando com a distribuição de "top ~ 17% scores" no sistema normal de rolagem foi o chamado "distribuição alta distorcida", então eu fiz um este cálculo pretendia estimar quais pontuações cada jogador obteria para a sua maior pontuação. Tendo em mente que eu apenas observei a distribuição para isso, ele mostra o jogador 1 com mais de 70% de chance de ter sua pontuação mais alta em 17 ou 18, enquanto o jogador 4 tem mais de 70% de chance de ter sua pontuação mais alta em apenas 15. distribuições alternativas dão resultados semelhantes: O jogador 1 geralmente tem pelo menos 60% de chance de ganhar 17 ou 18, enquanto o jogador 4 tem menos de 1% de chance.

Para uma medida alternativa, fiz um pouco de matemática para gerar um pool "típico", ou seja, probability of generating a score * 24 attempts = expected number of that score , e atribuí-los de acordo com seu procedimento para obter esses resultados:

  1. 17, 14, 13, 11, 11, 6
  2. 16, 14, 13, 11, 10, 7
  3. 16, 14, 13, 12, 10, 8
  4. 15, 15, 12, 12, 9, 9

Indo para o cálculo deste ângulo, podemos ver que a vantagem que o Jogador 1 obtém em sua estatística mais alta é significativa, já que provavelmente há apenas 17 ou 18 pontos em todo o grupo, mas diferenças entre os jogadores no segundo A quarta estatística é mínima porque 11-14 são muito comuns em 4d6 de queda 1. Há uma disparidade ainda maior na estatística mais baixa por causa de uma cauda mais plana, mas um "status de dump" é comumente desejável e duvido que os outros jogadores fiquem infelizes para mover pontos do menor para o mais alto deles.

    
12.04.2018 / 19:59

Esta não é a resposta para sua pergunta porque não sei como isso pode ser feito usando o Anydice, mas sei que isso pode ser feito com o Excel facilmente.

Eu rapidamente juntei esta planilha que simulará as jogadas de 24 x 4d6 (drop-the-lowest), e então atribuirá as pontuações de habilidade aos jogadores em "ordem de cobra" e calculará seus respectivos mods de habilidade.

link

PS. Os rolos aleatórios serão atualizados toda vez que uma célula for atualizada, pode ser necessário fazer o download da planilha para fazer isso. Você pode digitar ctrl + R para atualizar sem atualizar uma célula.

    
12.04.2018 / 01:36