所以我正在开展一个需要我进行模拟的项目。问题是需要完成的模拟次数取决于先前模拟的结果。它有点像递归,除了没有要调用的函数。第一个的模拟是通过for循环完成的。这给了一个数字。然后,我需要重复该模拟,直到该数字为0。
最好只显示代码然后尝试解释它我想。
for(int i = 0; i < newnumber; i++)
{
for(int i = 0; i < 5; i++)
{
//some probability loops
newnumber++;
}
}
//don't worry, I have some math that will make the new number
// go down over time so the loop will eventually come to a stop
如果我有这样的问题,我该怎么做呢?我已经可以看到问题是你为什么要这样做,答案是,我需要做一个疾病传播模拟。当一个人受到感染时,他们有可能感染另一个人。在我编写newnumber ++的地方,我也写了一些概率循环。被感染的百分比很低,因此循环不能扩展,但如果确实如此,我需要再次为感染者运行概率函数,因为现在他们有可能感染其他人。我该如何做这样的事情?
我尝试了一个while循环,但这只是让我无限循环,所以我不知道如何解决这样的问题。
答案 0 :(得分:1)
当然,您可以更改任何(非const
)变量的值,无论它是否在for
循环的条件部分中使用。因此是,你可以有一个for
循环。
但我建议不要编写这样的for
循环。 for
循环通常用于必须重复某些事情的情况下(当时)循环开始)次数。像你建议的那样改变条件需要跟踪循环体内所用变量的任何变化,这可能是调试的噩梦。
您可以使用do {} while
循环更清楚地陈述您的意图。 Example:
#include <iostream>
#include <random>
constexpr int INITIALLY_INFECTED = 42;
constexpr double INFECTION_RATE = 0.8;
int main() {
std::random_device rd;
std::mt19937 gen(rd());
int newlyInfected = INITIALLY_INFECTED;
int totalInfected = 0;
do {
totalInfected += newlyInfected;
newlyInfected = std::binomial_distribution<>(newlyInfected, INFECTION_RATE)(gen);
std::cout << "New infections: " << newlyInfected
<< "\ntotal now: " << totalInfected << std::endl;
} while (newlyInfected > 0);
}
这使您可以更清楚地说明意图:
[..]我需要再次为被感染的人运行概率函数,因为现在他们有可能感染别人[...]
在这里你说是否进行了新的模拟运行取决于是否有一些(新的)感染者。 newlyInfected > 0
几乎说明了这一点。 i < newnumber
没有。