我试图在不使用骰子包的情况下在R中运行一些概率代码。我知道当有两个向量时,可以使用外部命令生成一个矩阵,该矩阵将计算骰子卷的总和和值。是否有类似于五个骰子卷可以做同样事情的东西?
我正在努力在R中滚动五个六面骰子并生成一个代码来计算滚动总和在15到20之间的概率。
有什么建议吗?
答案 0 :(得分:4)
你总是可以通过模拟来做到这一点:
set.seed(1020)
nn<-1e6 #number simulations
#on each simulation, check whether the sum of 5
# independently rolled (6-sided) dice is less
# than 2.5 away from 17.5--equivalently, that
# the sum is between 15 & 20; the probability
# is the percentage of the time that this happens,
# or equivalently, the mean of the indicator function
> mean(replicate(nn,abs(sum(sample(6,5,T))-17.5)<=2.5))
[1] 0.556971
实际的解决方案是4332/7776 = .5570988,可以找到这个(效率低,但是谁关心因为6 ^ 5 = 7776)循环:
tot<-0L
for (i1 in 1:6){
for (i2 in 1:6){
for (i3 in 1:6){
for (i4 in 1:6){
for (i5 in 1:6){
s<-i1+i2+i3+i4+i5
tot<-tot+(s>=15&s<=20)
}
}
}
}
}
> tot/6^5
[1] 0.5570988
答案 1 :(得分:2)
你可以递归地应用outer
,首先计算2个骰子的总和,然后用第3个骰子计算这些结果的总和,然后......
但更高效的可能是在这种情况下使用expand.grid
:
> dice <- expand.grid( 1:6, 1:6, 1:6, 1:6, 1:6 )
> dice.sums <- rowSums(dice)
> mean( 15 <= dice.sums & dice.sums <= 20 )
[1] 0.5570988
您还可以使用combinat包中的hcube
函数生成组合。