2

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

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

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

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

4

5 回答 5

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
于 2013-04-07T15:19:03.530 回答
1

if我认为,您在orfor代码块中使用 %random% 。在这种情况下,您需要delayed expansion和!变量!而不是 %variables%。例子:

@echo off & setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
    echo %random% !random!
)
于 2013-04-07T06:42:48.893 回答
1

模数在这种情况下工作得很好:

set /a ran=%random% %% 4 + 1

将设置%ran%为 1 到 4 之间的数字。但是,这只适用于批处理文件。

在命令提示符下,您需要:

set /a num=%random% % 4 + 1
于 2013-04-07T06:57:50.720 回答
1

你的代码很好。不过我有一个怀疑。在您的完整脚本中,您是否在循环或语句set var中检查其值?如果是这样,当您检查结果的值是您的脚本继承为 environment variable的值时,可能是脚本外部命令行测试的保留。forif%var%%var%

如果我的评估是正确的,那么您需要一个setlocal enabledelayedexpansionand echo !var!。否则fororif%var%使用它当时包含的值forif第一次遇到的值进行评估。

于 2013-04-07T15:17:49.487 回答
1

您想要的实际命令是:

set /a var=%random% %% 4

这将为您提供:0、1、2 或 3。

如果您在 FOR 循环中执行此操作,请使用 !..!-type 变量而不是 %..%-type 变量,在这种情况下,您还需要setlocal enabledelayedexpansion靠近批处理文件开头的某个位置。

于 2013-04-08T14:44:00.923 回答