[英]Having issues with infinitely running nested for and while loops in R
我正在嘗試模擬一個人口,該人口每年快速增長或緩慢增長,最大規模為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
}
問題似乎出在您的while循環中。 當我運行代碼時,curr_pop在for循環的2826迭代中被設置為零。 我對rgeom函數還不太熟悉,但這是研究導致它返回零的原因的地方。
rgeom
函數返回一個隨機數向量,該向量具有與第一個參數一樣多的元素。 在第一個參數較小且第二個參數接近1的情況下,返回一組全零是時間問題,之后curr_pop <- sum(rgeom(curr_pop, p))
永遠保持0。
您可以通過在while循環中包裝該調用以檢查0和並將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)
調用引起的。 這樣,將始終生成相同的隨機數序列。 如果您希望程序更加隨機 ,則可能需要注釋掉該調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.