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

时间:2015-10-25 19:54:09

标签: windows batch-file batch-processing

以下脚本:

@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

返回相同的随机数,因此每次执行都会报告。请您提供一个解决方案,详细说明问题发生的原因。

谢谢

2 个答案:

答案 0 :(得分:1)

我无法重现这一点,但如果问题与%random%以微小间隔查询并且只是少量变化有关,那么另一个公式可能是一个解决方案。使用以下替代方法,即使%random%仅更改为1:

,您也会获得不同的输出
set /A "rand=(%random% %% n)+1"

答案 1 :(得分:1)

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

但是在同一个cmd实例中对相同或不同批处理文件的过度执行将检索不同(或不是,它是随机的)"随机"序列。

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

如果每个执行n相同或相似,并且%random%返回上一次执行中返回的值附近的值(如您所述),则n*%random%将返回结果接近上一次执行中的一个。除以32768,任何差异都将被丢弃,并以相同的选定文件结束。

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

set /a "rand=%random% %% n + 1"
相关问题