所以我试图获得滚动两个骰子
n
次数的所有可能组合。
目前我有:
# Get all possible rolls with two dice
d <- list(1, 2, 3, 4, 5, 6)
rolls <- lapply(apply(expand.grid(d, d), 1, identity), unlist)
# Get all possible ways to roll two dice twice
trials <-lapply(apply(expand.grid(rolls, rolls), 1, identity), unlist)
d
存储单个骰子上可以获得的所有可能值。 rolls
存储同时掷两个骰子的所有可能结果。 trials
存储同时掷两个骰子、连续两次的所有可能结果。
我可以将最后一行修改为
trials <-lapply(apply(expand.grid(rolls, rolls, rolls), 1, identity), unlist)
获得同时掷两个骰子的所有可能结果,连续三次,但我不知道如何使次数可变,以便我可以传递任意数字
n
并获得所有可能的结果同时掷两个骰子的结果,连续 n
次
假设您想要排列(1,2 和 2, 1)而不是组合(仅 1,2),这更简单:
n <- 2
perms <- expand.grid(as.data.frame(matrix(1:6, 6, n)))
dim(perms)
# [1] 36 2
n <- 4
perms <- expand.grid(as.data.frame(matrix(1:6, 6, n)))
dim(perms)
#[1] 1296 4
n <- 6
perms <- expand.grid(as.data.frame(matrix(1:6, 6, n)))
dim(perms)
# [1] 46656 6
我知道我大约 20 分钟前才发表这篇文章,但实际上我已经弄清楚了。解决办法是:
trials <-lapply(apply(expand.grid(rep(list(rolls), times = n)), 1, identity), unlist)
在列表上使用
expand_grid
的 tidyverse 解决方案。列表中的第 k
条目是位置 k
中可能值的向量。在您的情况下,每个卷的选项向量都是相同的,因此我们使用 rep
生成列表。我们可以选择命名列表条目,以便输出更容易解释。要将列表条目作为参数注入到 expand_grid
中,我们使用 rlang
拼接运算符 !!!
但我们也可以使用 do.call
,请参阅此问题,了解如何使用列名称扩展所有列。
n <- 3
roll_options <- rep(list(1:6), n)
names(roll_options) <- paste0("roll", seq_len(n))
expand_grid(!!!roll_options)
# # A tibble: 216 × 3
# roll1 roll2 roll3
# <int> <int> <int>
# 1 1 1 1
# 2 1 1 2
# 3 1 1 3
# 4 1 1 4
# 5 1 1 5
# 6 1 1 6
# 7 1 2 1
# 8 1 2 2
# 9 1 2 3
# 10 1 2 4
# # ℹ 206 more rows
# # ℹ Use `print(n = ...)` to see more rows