我有一个无限循环

时间:2011-01-04 06:05:11

标签: delphi

newValue := oldValue;
repeat
    delta := (RandomRange(0, 200) / 100) - 1;
    newValue := newValue + delta;
 until (newValue > 24) and (newValue < 40);
 oldValue := newValue;


newValue2 := oldValue2;
repeat
    delta := (RandomRange(0, 200) / 100) - 1;
    newValue2 := newValue2 + delta;
 until (newValue2 > 24) and (newValue2 < 40) and (newValue2 < newValue); 
 oldValue2 := newValue2;

经过几次迭代后,这会在第二个循环中遇到无限循环。它意味着将Float随机地改为-1到+1并保持在24到40的范围内,同时仍然小于另一个以相同方式随机改变的Float。

谁可以先让我说“d'哦!”? (可能是(newValue2 < newValue)


德哦!

嗯,现在有人指出,答案是显而易见的。 newValue := oldValue + delta;,而不是'newValue:= newValue + delta;',以便代码读取(类似于两个循环)

newValue := oldValue;
repeat
    delta := (RandomRange(0, 200) / 100) - 1;
    newValue := oldValue + delta;              <==== **NOT**  newValue
 until (newValue > 24) and (newValue < 40);
 oldValue := newValue;

全部谢谢,全部和很多+1

4 个答案:

答案 0 :(得分:7)

“将它保持在24到40之间”是什么意思?您的条件“until (newValue > 24) and (newValue < 40)”表示一旦它在该范围内就会停止;如果超出该范围,它将永远存在。

终止的可能性取决于oldValue。您期望oldValue有什么价值?

在任何情况下,都不保证这样的循环终止。您每次都会随机更改数字,因此无法保证它会完全进入终止范围。特别是,-1和1之间的大量随机数全部加在一起通常总和大约为0,因此您不能指望该数字随时间发生显着变化。可能的情况是它永远不会进入该范围。

答案 1 :(得分:3)

每次循环后,您将oldValue的值设置两次。看起来你真的想在第二次循环之后设置oldValue2的值。

答案 2 :(得分:1)

虽然我不知道Delphi,但我想知道RandomRange函数发生了什么。它写的方式,好像RandomRange给你一个从0到200的数字,然后你除以100得到一个从0到2的数字。然后,你减去1,从中得到一个数字-1到1.如果我正确读取它,那么随着时间的推移,值应保持大致相同。

如果跟踪循环条件中的值,会得到什么?

答案 3 :(得分:1)

我不是德尔福人,所以我可能会离开(如果有人告诉我,我会删除我的答案) 但是,三角洲不会像零点一样消极,因为它在每次迭代时都是正面的。或简化为-1,因为它是+1。

如果这是真的,那么newValue的值在多次迭代中几乎没有变化吗?

<强>更新

或者澄清,-1和1之间的很多随机数的总和不会非常接近于零。

在任何情况下创建变量以保存您可能想要的迭代次数都不会更简单。

e.g。

repeatcount:= RandomRange(24,40)
num:0

repeat
  num := num +1
until (num = repeatcount)

或者如果您只是希望新值介于24到40之间

newValue := Random(24,40)