Матрица вероятности броска игральных костей с D20 (20-сторонняя игральная кость) - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь запустить симуляцию игры в кости в R. В моем проекте я использую Dungeons и Dragon's D20, 20-ти гранный кубик, который используется в настольных играх, таких как.

Один изОсобенности игры: когда игрок атакует или читает заклинания, он бросает D20, и результат броска определяет успех.Игроки могут иметь положительные или отрицательные модификаторы, чтобы добавить к сумме броска.Я пытаюсь создать игрока, выдающего определенный результат, на основе его модификатора.Это то, что я до сих пор:

D20_prob = function(d, nreps) {
roll = matrix(sample(20, size = d * nreps, replace = T), ncol = nreps)
  result_tot = (roll + 1) # Adds modifier
  return(prop.table(table(result_tot)))
}

D20_prob(1, 100)

И это приводит к примерно так:

   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21 
0.02 0.04 0.04 0.02 0.10 0.08 0.05 0.05 0.05 0.03 0.04 0.04 0.03 0.06 0.05 0.05 0.08 0.04 0.06 0.07

В игре D & D модификаторы могутдиапазон от -5 до +5.Может ли кто-нибудь помочь мне изменить мой код, чтобы я мог создать таблицу в диапазоне от -5 до +5?

1 Ответ

0 голосов
/ 11 февраля 2019

Я думаю, что вам нужна функция

sample.int(10, n= 20, replace = TRUE)

Это действительно зависит от того, что вы хотите смоделировать.Если вы хотите увидеть, насколько вероятен результат, учитывая определенное количество бросков (то есть, если я использую этот модификатор, то он лучше другого, учитывая урон, который я нанесу в следующие двадцать часов игры), здесь вы должны использовать вышеупомянутую функциюи симулируйте как можно больше бросков (т.е. 1000 или больше).Второй вариант - вы хотите увидеть вероятность результата в целом (то есть, если мне нужно бросить выше 18, какова вероятность того, что я брослю это)?В этом случае вероятность броска числа составляет 1/20, так как у вас есть D20.

Однажды я сделал похожую вещь: мой симулятор был сделан со случайными бросками, чтобы увидеть, насколько вероятна комбинация, чтобы дать игрокам представление о том, как их модификаторы будут работать в долгосрочной перспективе.Но в этом случае помните, что случайные числа никогда не бывают действительно случайными (есть лучшие и худшие пакеты).

Редактировать:

Для обхода повреждений вы можете использовать цикл for:

 for (modifier in -5:5){
  result_tot = prop.table(table(roll + modifier))
}

Проблема в том, что я никогда не работал с data.tables и некажется, в состоянии объединить все различные таблицы, которые создаются.В приведенном выше примере каждый цикл перезаписывает таблицу result_tot.Поэтому вам необходимо распечатать его раньше или найти способ объединения полученных таблиц.

...