我有一段看起来像这样的代码(启用延迟扩展):
for /l %%y in (1,1,%variable%) do (
set /a rand=!random! * 100 / 32768 + 1
echo !rand!
if !rand! GEQ %chance% (
set /a var=%var%+%varx%
)
)
echo !rand!
部分显示数字,但if !rand! GEQ %chance%
只是看到了!兰德!作为字符串,而不是它的价值。所以即使!兰德!大于%几率%它仍会跳过命令。
奇怪的部分是无论在循环结束时!rand!
大于%chance%
多少次,%varx%
只增加IF
一次。这里应该做些什么,以便!rand!
语句看到index.html
的价值?
答案 0 :(得分:3)
正如斯蒂芬在评论中所说 - 在扩展random
和rand
时,你知道在循环中使用延迟扩展。为什么不在var
使用它? %var%
的值在循环中是恒定的。您需要!var!
才能看到每次迭代时存在的动态值。
for /l %%y in (1,1,%variable%) do (
set /a rand=!random! * 100 / 32768 + 1
echo !rand!
if !rand! GEQ %chance% (
set /a var=!var!+%varx%
)
)
但还有另一种解决方案。 SET / A知道如何在没有%
或!
的情况下自行扩展变量。请注意,仍需要!random!
,因为random
不是真正的环境变量。
for /l %%y in (1,1,%variable%) do (
set /a rand=!random! * 100 / 32768 + 1
echo !rand!
if !rand! GEQ %chance% (
set /a var=var+varx
)
)
或者您可以使用+=
运算符
for /l %%y in (1,1,%variable%) do (
set /a rand=!random! * 100 / 32768 + 1
echo !rand!
if !rand! GEQ %chance% (
set /a var+=varx
)
)
如果您想获得最佳性能,您可以在一个SET / A内完成所有计算,而无需任何IF。但这非常极端,而且不太可读:
for /l %%y in (1,1,%variable%) do (
2>nul set /a "rand=!random!*100/32768+1, 1/(rand/chance), var+=varx"
echo !rand!
)
var
仅在rand
大于或等于chance
时递增。如果rand
小于chance
,则会得到除以0错误(由stderr重定向隐藏),并且SET / A不再继续。