9

我正在尝试模拟滚动两个骰子。我用了:

d2 <- sample(1:6, 10^6, replace = T) + sample(1:6, 10^6, replace = T)

并得到预期的结果。我也试过

s2d <- c()
for (i in 1:6) { 
  for (j in 1:6){ 
    s2d <- c(s2d, (i+j)) 
  } 
}
d2 <- sample(s2d, 10^6, replace=T)

这也有效,但这些感觉有点“蛮力”。有没有更简单、更优雅的方法呢?

更一般地说,是否有一个函数需要 2 个(或更多)独立事件并对它们进行操作(加法、乘法)?

4

3 回答 3

15

如果您的问题是您无法掷出任意数量的骰子,例如:

rowSums(replicate(2, sample(6, 10^6, replace=T)))

会更灵活。

于 2013-02-11T20:28:20.603 回答
3

我同意大卫的观点,你的第一个选择似乎没有什么特别的问题。如果你真的只是在两个骰子的总和之后,另一种方法可能是这样:

sample(2:12,size = 100,replace = TRUE, prob = table(outer(1:6,1:6,"+")) / 36)
于 2013-02-11T20:31:18.593 回答
3

TeachingDemos 包中有一个dice模拟掷骰子的函数(甚至还有一个选项来绘制结果,但 1000 次掷骰不会产生有意义的绘图)。这可能看起来不那么蛮力,但在内部它与已经发布的内容相似。您可以使用 apply 或相关函数对返回的列进行求和等操作。

于 2013-02-11T21:21:33.437 回答