Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 批处理文件中的随机变量_Random_Batch File - Fatal编程技术网

Random 批处理文件中的随机变量

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

我正在尝试使用批处理文件创建一个介于0和3之间的随机变量。现在我有以下代码:

@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