0

对于游戏设计问题,我需要更好地检查二项分布。使用R,我需要构建一个二维表 - 给定一个固定参数“池”(掷骰子的数量),“边数”(骰子的边数)具有:

  • 在行中 --> 成功的最小值(从 0 到边,这是一个离散分布)
  • 在列中 --> 成功次数(范围从 0 到池)

我知道如何将其计算为单个任务,但我不确定如何迭代以填充整个表格

编辑: 我忘了说我想计算至少获得成功次数的概率 p。

4

2 回答 2

0

这让你成功了一半。
如果您是新手R,您可能会错过一个非常强大的功能,即您可以使用值向量作为另一个向量的索引。这使得部分问题变得非常简单:

pool <- 3
sides <- 20  # <cough>D&D<cough>


# you need to strore the values somewhere, use a vector
NumberOfRollsPerSide <- rep(0, sides)
names(NumberOfRollsPerSide) <- 1:sides # this will be useful in table

## Repeast so long as there are still zeros
##     ie, so long as there is a side that has not come up yet
while (any(NumberOfRollsPerSide == 0)) {
  # roll once
  oneRoll <- sample(1:sides, pool, TRUE)  

  # add (+1) to each sides' total rolls
  #  note that you can use the roll outcome to index the vector. R is great. 
  NumberOfRollsPerSide[oneRoll] <- NumberOfRollsPerSide[oneRoll] + 1
}

# These are your results: 
  NumberOfRollsPerSide

你现在要做的就是计算每一边,它首先出现在哪个卷号中。

于 2013-07-31T16:49:57.720 回答
0

好的,我认为这可能是一个简单的解决方案。它具有行上的成功率和列上掷骰子 (p) 的成功阈值。

poolDistribution <- function(n, sides=10, digits=2, roll.Under=FALSE){
  m <- 1:sides
  names(m) <- paste(m,ifelse(roll.Under,"-", "+"),sep="")
  s <- 1:n
  names(s) <- paste(s,n,sep="/")
  sapply(m, function(m.value) round((if(roll.Under) (1 - pbinom(s - 1, n, (m.value)/sides))*100 else (1 - pbinom(s - 1, n, (sides - m.value + 1)/sides))*100), digits=digits))  
于 2013-08-01T14:35:38.393 回答