%RANDOM% 每次执行返回相同的输出

%RANDOM% returning same output every execution

以下脚本:

@echo off
setlocal EnableDelayedExpansion
set n=0
for /R %%f in (./*.avi;./*.mp4) do (
   set /A n+=1
   set "file[!n!]=%%f"
)
set /A "rand=(n*%random%)/32768+1"
ECHO %rand%
ECHO "!file[%rand%]!"
endlocal
PAUSE

Returns相同的随机数,因此每次执行都归档。请您提出一个解决方案,并详细说明问题发生的原因。

谢谢

我无法重现此问题,但如果问题与以微小间隔查询的 %random% 相关,并且它仅发生少量变化,那么另一个公式可能是解决方案。使用以下替代方案,即使 %random% 仅随 1 发生变化,您也会得到不同的输出:

set /A "rand=(%random% %% n)+1"

cmd 使用的 PRNG 使用当前时间初始化,分辨率为一秒,每个 cmd 实例一次(此行为已暴露 here)。在同一秒内启动的两个单独的 cmd 实例将生成相同的伪随机序列。

但是在同一 cmd 实例中连续执行相同或不同的批处理文件将检索不同的(或者不是随机的)"random" 序列。

在第一种情况下,在相同或接近几秒的时间启动单独的实例,您可以获得问题中公开的指示行为,但问题会因代码中的算术而增加。

如果 n 与每次执行相同或相似,并且 %random% return 接近上次执行中 return 的值(如您描述的),那么 n*%random% 将 return 一个接近上次执行的结果。除以 32768,任何差异都将被舍弃,您最终会得到相同的所选文件。

在这种情况下,最好使用取模运算符。作为除法的余数,仅从稍微不同的起始随机值就更容易得到不同的结果

set /a "rand=%random% %% n + 1"