当我在项目中进行调试模式时,我可以看到真实的结果,我确信,这是正确的代码。但当我开始应用程序不在调试模式 - 我得到错误的结果!
另外,当我厌倦了在调试模式下工作时,按“继续”按钮,我看到了什么?调试后,程序开始出错!
你能告诉我,发生了什么事吗??我不知道为什么会这样!
这是我的代码。如果您有任何疑问,请写信给我。我可以回答任何问题。
var tinarr = new List<double>();
var toutarr = new List<double>();
tin=RandTime(lambda);
while (tin > T & tin<=0)
{
tin = RandTime(lambda);
}
Tin = tin;
for (double i = step; i <= T; i += step)
{
if (Tin > T) break;
if (Tout > T) break;
while (Tin <= i)
{
if (CarCount < L / l)
{
CarIn++;
CarCount++;
tinarr.Add(Tin);
listBox1.Items.Add("+" + Tin.ToString());
//генерация времени выезда для въехавшей машины
tout = RandTime(mu);
//Tout = 0;
Tout += tout;
while (Tout <= Tin)
{
Tout -= tout;
tout = RandTime(mu);
Tout += tout;
}
if (toutarr.Count > 0)
{
while (Tout <= toutarr[0])
{
Tout -= tout;
tout = RandTime(mu);
Tout += tout;
}
}
if (Tout > T) break;
toutarr.Add(Tout);
listBox2.Items.Add(Tout.ToString());
}
else
{
CarError++;
listBox1.Items.Add(Tin.ToString());
}
//генерация времени следующей въехавшей машины
tin = RandTime(lambda);
Tin += tin;
if (Tin > T) break;
//OUT cars
/* * */
if (toutarr.Count > 0)
{
for (int j = toutarr.Count - 1; j >= 0; j--)
{
if (toutarr.Count > 0)
{
if (toutarr[j] < Tin)
{
toutarr.RemoveAt(j);
CarCount--;
CarOut++;
}
}
}
}
/* ^ */
}
因此。结果1,当programm不在调试模式下时。你可以看到数字重复。
结果2,它在调试模式下工作。真实的结果。
答案 0 :(得分:0)
好的,我将在黑暗中拍摄。我的猜测是你使用的是基于时间的随机数生成器,而不是生成它的一个实例并使用相同的实例来生成随机数的样本,您将在每次迭代时重新实例化随机数生成器。现在,当程序不处于调试模式时,每次迭代都在相同的时钟周期内进行(从而为生成器提供相同的种子),以便第一次调用每个实例的.Next()生成的第一个数字产生相同的数字。当您进入调试模式并开始逐步执行代码时,您将在生成器的每个实例化之间放置几秒钟,因此您为每个实例提供不同的种子。那样,你看到了正确的结果。当您再次点击继续时,从该点开始实例化的生成器使用相同的结果开始,并且重新发生不正确的行为。
解决方法很简单。创建一个随机数生成器。使其对您的应用程序保持静态。对此实例进行所有调用。