我正在尝试使用批处理文件创建 0 到 3 之间的随机变量。现在我有以下代码:
@echo off
set /a var=%random%/8192
@echo %var%
Pause
该批处理文件每次都返回“2”。如果我直接在命令行中输入相同的命令,它会返回 0 到 3。
任何相关知识将不胜感激:)
我正在尝试使用批处理文件创建 0 到 3 之间的随机变量。现在我有以下代码:
@echo off
set /a var=%random%/8192
@echo %var%
Pause
该批处理文件每次都返回“2”。如果我直接在命令行中输入相同的命令,它会返回 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
if
我认为,您在orfor
代码块中使用 %random% 。在这种情况下,您需要delayed expansion
和!变量!而不是 %variables%。例子:
@echo off & setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
echo %random% !random!
)
模数在这种情况下工作得很好:
set /a ran=%random% %% 4 + 1
将设置%ran%
为 1 到 4 之间的数字。但是,这只适用于批处理文件。
在命令提示符下,您需要:
set /a num=%random% % 4 + 1
你的代码很好。不过我有一个怀疑。在您的完整脚本中,您是否在循环或语句set var
中检查其值?如果是这样,当您检查结果的值是您的脚本继承为 environment variable的值时,可能是脚本外部命令行测试的保留。for
if
%var%
%var%
如果我的评估是正确的,那么您需要一个setlocal enabledelayedexpansion
and echo !var!
。否则for
orif
将%var%
使用它当时包含的值for
或if
第一次遇到的值进行评估。
您想要的实际命令是:
set /a var=%random% %% 4
这将为您提供:0、1、2 或 3。
如果您在 FOR 循环中执行此操作,请使用 !..!-type 变量而不是 %..%-type 变量,在这种情况下,您还需要setlocal enabledelayedexpansion
靠近批处理文件开头的某个位置。