Random 批处理文件中的随机变量
我正在尝试使用批处理文件创建一个介于0和3之间的随机变量。现在我有以下代码:Random 批处理文件中的随机变量,random,batch-file,Random,Batch File,我正在尝试使用批处理文件创建一个介于0和3之间的随机变量。现在我有以下代码: @echo off set /a var=%random%/8192 @echo %var% Pause 此批处理文件每次返回“2”。如果我直接在命令行中键入相同的命令,它将返回0到3 任何相关知识都将不胜感激:)我想,您可以在if或代码块中使用%random%。在这种情况下,您需要延迟扩展和!变量!而不是%变量%。例如: @echo off & setlocal enabledelayedexpansion
@echo off
set /a var=%random%/8192
@echo %var%
Pause
此批处理文件每次返回“2”。如果我直接在命令行中键入相同的命令,它将返回0到3
任何相关知识都将不胜感激:)我想,您可以在
if
或代码块中使用%random%。在这种情况下,您需要延迟扩展
和!变量!而不是%变量%。例如:
@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
你的代码很好。不过我有点怀疑。在您的完整脚本中,您是否设置var
并在for
循环或if
语句中检查其值?如果是这样,当您检查%var%
的值时,结果是脚本作为环境变量%var%
的值继承了什么,可能是脚本外部的命令行测试的延迟
如果我的评估是正确的,那么您需要一个setlocalenabledelayedexpansion
和echo!瓦尔代码>。否则for
或if
将使用for
或if
第一次遇到时包含的值对%var%
进行评估。编辑:我更改了答案,因为OP更改了他的问题:最初所需随机数的范围是0到4
正确的公式是:
set /a var=%random% * 4 / 32768
相反,使用其他运算符(如/或%)会修改随机数分布,因此您将比使用正确的公式更频繁地得到重复结果
编辑:添加其他解释
前面的代码应该在上面的示例中正常工作。但是,如果代码放在代码块内(用括号括起来),则必须在块内可能修改的所有变量(包括随机变量)中使用延迟扩展(如其他人在回答中所示)。例如:
@echo off
setlocal EnableDelayedExpansion
:ProgStart
(
set /a var = !random! * 4 / 32768
goto target!var!
)
如果您愿意,您可以使用这个更简单的公式,它给出了相同的结果(0到3之间的随机数):
您需要的实际命令是:
set /a var=%random% %% 4
这将为您提供:0、1、2或3
如果您在FOR循环中执行此操作,请使用-类型变量而不是%..%-类型变量,在这种情况下,您还需要在批处理文件开头附近的某个位置使用setlocal enabledelayedexpansion
。我没有这个问题。在@echo%var%
之前尝试取出@
?虽然这真的不会改变任何事情…您的代码生成一个介于0和3之间的随机数;正确的公式是:set/a var=%random%/6554
。然而,标准公式要清楚得多(见下面我的答案),它是4而不是5,32768/4=8192。他的命令是正确的,只是简化了形式。@rojo:Op希望“创建一个介于0和4之间的随机变量”,并且“%random%”扩展为一个介于0和32767之间的随机十进制数(取自set/?
)。这意味着%random%/8192会产生一个介于0和3之间的随机数(试试看:set/a 32767/8192
)。当然,你是对的。很抱歉。我现在有个蹒跚学步的孩子爬到我身上,无法更新我的答案。如果你同意我的解释,为什么他的代码在通过cmd和批处理脚本执行时会有不同的结果,请随意从我的答案中复制/粘贴,这样在这个被破坏的线程上至少有一个答案将提前解决op.:)+1所演示的所有问题。是的,我在代码中稍后使用了带有if语句的Var,但由于这个更改,我仍然遇到了相同的问题。我是否正确地实现了这一点@echo off setlocal enabledelayedexpansion:ProgStart set/a var=!随机的/8192如果!瓦尔==0转到目标0如果!瓦尔==1转到目标1如果!瓦尔==2转到目标2如果!瓦尔==3后藤target3@user2053067:我可以请你复习我的答案吗?。。。谢谢
set /a var=%random% %% 4