我想在R中运行一个程序,要求用户选择一些骰子,在骰子上运行模拟,并确定将最小数字滚动到最大数量的概率。
例如,如果用户选择5个模具,那么最小滚动将是5x1 = 5并且最大滚动将是5x6 = 30。我已经拥有一定数量的骰子和一组总数的代码 - 只需要知道如何增加它。 'd'是掷骰数,'k'是掷骰的总数,'nreps'是模拟跑(例如1,000,000)。我想将每个概率存储在一个向量中,然后给出概率与总滚动(从最小到最大)的图(泊松分布)。
probtotk <- function(d, k, nreps){
count <- 0
#do the experiment nreps times
for (rep in 1:nreps){
total <- sum(sample(1:6, d, replace = TRUE))
if (total == k) count <- count +1
}
return(count/nreps)
}
答案 0 :(得分:3)
我们可以使用R的矢量化来快速完成这项工作。正如我的评论所示,我不会使用k
。
对于d
骰子和nreps
模拟,我们将有d * nreps
个总掷骰。我们使用sample(6, size = d * nreps, replace = T)
一次模拟这些。我们将结果放在包含nreps
列和d
行的矩阵中,因此每列代表一卷d
骰子。列总和给出了每个卷的总数。 table
函数计算每个总计的出现次数,prop.table
函数将其转换为一个比例。
dice_tot_prob = function(d, nreps) {
rolls = matrix(sample(6, size = d * nreps, replace = T), ncol = nreps)
totals = colSums(rolls)
return(prop.table(table(totals)))
}
dice_tot_prob(5, 1e5)
totals
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
0.00015 0.00066 0.00200 0.00446 0.00904 0.01615 0.02655 0.03958 0.05456 0.07013 0.08379 0.09511 0.10065 0.10068 0.09214 0.08391 0.06936 0.05384 0.03891
24 25 26 27 28 29 30
0.02576 0.01664 0.00880 0.00474 0.00180 0.00044 0.00015
prop.table
结果很好,因为它有一个默认的绘图方法:
plot(dice_tot_prob(5, 1e5))
答案 1 :(得分:0)
我认为你需要的是:
library(magrittr)
sample(1:6, nreps * d, replace = TRUE) %>%
matrix(nrow = d) %>%
colSums() %>%
table() %>%
divide_by(nreps)