对于游戏设计问题,我需要更好地检查二项分布。使用R,我需要构建一个二维表 - 给定一个固定参数“池”(掷骰子的数量),“边数”(骰子的边数)具有:
- 在行中 --> 成功的最小值(从 0 到边,这是一个离散分布)
- 在列中 --> 成功次数(范围从 0 到池)
我知道如何将其计算为单个任务,但我不确定如何迭代以填充整个表格
编辑: 我忘了说我想计算至少获得成功次数的概率 p。
这让你成功了一半。
如果您是新手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
你现在要做的就是计算每一边,它首先出现在哪个卷号中。
好的,我认为这可能是一个简单的解决方案。它具有行上的成功率和列上掷骰子 (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))