首页 > 解决方案 > 使用 D20(20 面骰子)的掷骰概率矩阵

问题描述

我正在尝试在 R 中运行骰子滚动模拟。在我的项目中,我使用的是龙与地下城的 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 的表格吗?

标签: rmatrixdice

解决方案


我认为你想要的功能是

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

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

我曾经做过类似的事情:我的模拟器是用随机滚动完成的,看看组合成功的可能性有多大,让玩家了解他们的修改器从长远来看是如何工作的。但在这种情况下,请注意随机数永远不是真正随机的(有更好和更差的包)。

编辑:

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

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

问题是我从未使用过 data.tables,而且我似乎无法合并所有生成的不同表。在上面的示例中,每个循环都会覆盖表 result_tot。所以你需要先打印出来或者想办法合并结果表。


推荐阅读