批处理文件中的随机变量

时间:2013-04-07 05:28:05

标签: random batch-file

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

@echo off
set /a var=%random%/8192
@echo %var%
Pause

此批处理文件每次都返回“2”。如果我直接在命令行中输入相同的命令,则返回0到3。

任何相关的知识将不胜感激:)

5 个答案:

答案 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)

我认为,您在iffor代码块中使用%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 enabledelayedexpansionecho !var!。否则,forif将使用{I}首次遇到%var%for时包含的值来评估if

答案 4 :(得分:1)

您想要的实际命令是:

set /a var=%random% %% 4

这将给你:0,1,2或3。

如果你在FOR循环中使用!...! - 类型变量而不是%..% - 类型变量,在这种情况下,你还需要在批处理文件开头附近的某处setlocal enabledelayedexpansion