D20(20面骰子)的骰子滚动概率矩阵

时间:2019-02-09 18:22:25

标签: r matrix dice

我正在尝试在R中运行骰子滚动模拟。在我的项目中,我使用的是Dungeons and 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 :(得分:1)

我认为您想要的功能是

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

这实际上取决于您要模拟的内容。 如果您想查看结果的可能性,在一定的掷骰数下(即如果我使用该修饰符,考虑到我接下来二十个小时的游戏伤害,它是否比另一个修饰符更好),在这里您可以使用上述功能并模拟尽可能多的卷(即1000或更多)。 第二个选项是您希望大致看到结果的可能性(即,如果我需要高于18,那么我获得该结果的机会是多少)。在这种情况下,因为您有D20,所以滚动数字的概率为1/20。

我曾经做过类似的事情:我的模拟器是随机滚动完成的,目的是观察组合成功的可能性,以使玩家了解其修饰符从长远来看将如何工作。 但是在那种情况下,请注意,随机数永远不会真正是随机的(有好有坏的软件包)。

编辑:

要遍历损失,可以使用for循环:

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

问题是我从未使用过data.tables,而且似乎无法合并所有生成的不同表。在上面的示例中,每个循环都覆盖表result_tot。因此,您需要先打印它,或者找到一种合并结果表的方法。