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
答案 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)