我正在尝试使用批处理文件创建0到3之间的随机变量。现在我有以下代码:
@echo off
set /a var=%random%/8192
@echo %var%
Pause
此批处理文件每次都返回“2”。如果我直接在命令行中输入相同的命令,则返回0到3。
任何相关的知识将不胜感激:)
答案 0 :(得分:3)
编辑:我改变了答案,因为OP改变了他的问题:原来所需的随机数范围是0到4 ......
正确的公式是:
set /a var=%random% * 4 / 32768
使用其他运算符(例如/或%)会修改随机数分布,因此您将比使用正确的公式更频繁地获得重复结果。
编辑:添加了其他说明
以前的代码应该在上面的示例中正确使用。但是,如果您的代码放在代码块(括在括号中)中,那么您必须在所有变量中使用延迟扩展(如其答案中指出的其他人)可以在块内修改,包括RANDOM。例如:
@echo off
setlocal EnableDelayedExpansion
:ProgStart
(
set /a var = !random! * 4 / 32768
goto target!var!
)
如果您愿意,您可以使用这个更简单的公式,给出相同的结果(0到3之间的随机数):
set /a var = !random! / 8192
答案 1 :(得分:1)
我认为,您在if
或for
代码块中使用%random%。在这种情况下,您需要delayed expansion
和!变量!而不是%变量%。例如:
@echo off & setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
echo %random% !random!
)
答案 2 :(得分:1)
Modulo在这种情况下效果很好:
set /a ran=%random% %% 4 + 1
将%ran%
设置为1到4之间的数字。但是,这仅适用于批处理文件。
在命令提示符下,您需要:
set /a num=%random% % 4 + 1
答案 3 :(得分:1)
你的代码很好。我有一个怀疑。在完整的脚本中,您是set var
并在for
循环或if
声明中检查其值吗?如果是这样,当您检查%var%
的值时,结果是您的脚本继承的任何值作为环境变量%var%
的值,可能是从脚本外部的命令行测试中保留的。
如果我的评估属实,那么您需要setlocal enabledelayedexpansion
和echo !var!
。否则,for
或if
将使用{I}首次遇到%var%
或for
时包含的值来评估if
。
答案 4 :(得分:1)
您想要的实际命令是:
set /a var=%random% %% 4
这将给你:0,1,2或3。
如果你在FOR循环中使用!...! - 类型变量而不是%..% - 类型变量,在这种情况下,你还需要在批处理文件开头附近的某处setlocal enabledelayedexpansion