For与Do While循环计数结果不符合预期问题咨询
问题分析:Counter取值不符合预期的原因
首先,你的代码是VBScript,问题出在两个关键环节,直接导致Counter远低于你的预期:
1. For循环的循环变量被手动修改,导致循环次数直接减半
VBScript的For i = 0 To 99循环,每次迭代结束后会自动将i递增1(默认步长为1)。但你在循环体最后加了一行i = i + 1,这意味着每次循环i实际会增加2:
- 第一次循环:i从0开始,执行完循环体后手动把i改成1,随后For循环自动将i加1变成2,进入下一次循环
- 第二次循环:i=2,执行完手动变成3,For自动加1变成4
- ……以此类推,最后i会直接跳到100,循环提前结束
原本0 To 99应该执行100次循环,但现在实际只执行了50次(i取0、2、4……98,共50个值)。这直接导致外层循环里的Counter = Counter + 1只执行了50次,而不是你预期的100次——这是Counter小于100的核心原因。
2. Do While循环的逻辑带来的增量有限
再看Do While的逻辑:Do While Srate <= Rnd(),Rnd()返回的是0到1之间(不包含1)的随机数。初始Srate是0.55,Prate是0.03:
- 大多数情况下,Rnd()返回的值会大于0.55,此时Do While循环根本不会执行,这次外层循环里Counter只加1(来自最后那行
Counter = Counter +1) - 少数情况下,Rnd()返回的值<=0.55,才会进入Do While循环:每次进入循环,Counter加1,Srate增加0.03(变得更大),下一次判断时满足条件的概率更低。就算Do While执行几次,每次外层循环的Counter增量最多也就是几次而已,但架不住外层循环只有50次,整体Counter很难达到100。
修正建议
要让Counter达到你的预期,首先要修复循环次数的问题:
- 直接删除循环体里的
i = i + 1,让For循环正常执行100次 - 如果需要手动控制循环逻辑,建议改用
Do While/Do Until循环,不要在For循环里修改循环变量
举个修正后的示例:
Counter = 0 Srate = 0.55 Prate = 0.03 For i = 0 To 99 Do While Srate <= Rnd() Counter = Counter + 1 Srate = Srate + Prate Loop Counter = Counter + 1 Next ' 此时外层循环执行100次,Counter的基础增量是100,加上Do While的额外增量,会大于100 MsgBox(i) ' 输出100 MsgBox(Counter) ' 输出大于100的数值
内容的提问来源于stack exchange,提问作者ANOMEL
相关产品推荐
相关产品推荐

