r - 使用 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 的表格吗?
解决方案
我认为你想要的功能是
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。所以你需要先打印出来或者想办法合并结果表。
推荐阅读
- php - Laravel / PHP - 高级多态关系
- r - 如何在调整后的折叠更改代码中使用 is.na 或 is.infinite 覆盖数据帧中的 NA?
- python-3.x - 带有 https 的 Kivy UrlRequest
- r - 使格子图中的某些线条不可见
- paypal - Paypal Sandbox Orders API - 捕获后资金未添加到余额中
- emacs - “选择已删除缓冲区”的“org-agenda-get-day-entries”错误
- html - 使用 Safari 在输入焦点上不需要的自动滚动到顶部
- javascript - 比较日期字符串
- javascript - C#多维数组只打印第一个元素
- c - 将函数传递给函数时,需要作为一元“&”操作数的错误左值