我正在尝试模拟每年人口快速或缓慢增长的人口,最大规模为5000人。然后我在运行此循环5000次以查看时间变化为5000。
然而,循环只是继续运行,我必须手动停止。
奇怪的是,popVector
是一个记录每一轮人口规模的向量,增长到一个巨大的规模,往往成千上万,我不会从数字中预测出来我正在使用。
非常感谢任何解决此问题的帮助!
MAXPOP <- 5000 #Set max population
trials <- 5000
genVector <- numeric(trials)
set.seed(1)
for(j in 1:trials) {
curr_pop <- 20 #Set initial population
genTime <- 1
popVector <- curr_pop;
while(curr_pop <= MAXPOP) {
if(genTime%%2 == 0) {
p <- 0.25
}
if(genTime%%2 != 0) {
p <- 0.5
}
curr_pop <- sum(rgeom(curr_pop, p)) #Set current population
popVector <- c(popVector, curr_pop)
genTime <- genTime + 1
}
genVector[j] <- genTime
}
答案 0 :(得分:1)
问题似乎出现在你的while循环中。当我运行代码时,curr_pop会在for循环的2826次迭代中将设置为零。我对rgeom函数不够熟悉,但这是调查导致它返回零的原因。
答案 1 :(得分:0)
rgeom
函数返回一个随机数向量,其元素与第一个参数一样多。使用小的第一个参数,第二个参数接近1,它返回一组全零之前是一个时间问题,之后curr_pop <- sum(rgeom(curr_pop, p))
将永远保持为0。
您可以通过在while循环中包装该调用以检查0 sum并将curr_pop
重置为其他内容来解决此问题,例如:
while (T) {
curr_pop <- sum(rgeom(curr_pop, p)) #Set current population
if (curr_pop > 0) break
else curr_pop <- 1
}
@ Havik23提到的迭代步骤2826是因为set.seed(1)
调用。这样,将始终生成相同的随机数序列。如果您希望自己的程序更随机,则可能需要注释掉该通话。