R编程 - 投掷骰子算法

时间:2017-08-24 16:14:52

标签: r

我想在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) 
}

2 个答案:

答案 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))

enter image description here

答案 1 :(得分:0)

我认为你需要的是:

library(magrittr)
sample(1:6, nreps * d, replace = TRUE) %>%
  matrix(nrow = d) %>%
  colSums() %>%
  table() %>%
  divide_by(nreps)