【问题标题】:%RANDOM% returning same output every execution%RANDOM% 每次执行都返回相同的输出
【发布时间】:2016-01-24 21:08:00
【问题描述】:
以下脚本:
@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
返回相同的随机数,因此每次执行都归档。请您建议一个解决方案,并详细说明问题发生的原因。
谢谢
【问题讨论】:
标签:
windows
batch-file
batch-processing
【解决方案1】:
我无法重现这一点,但如果问题与 %random% 以很小的间隔被查询有关,并且它只是少量变化,那么另一个公式可能是一个解决方案。使用以下替代方法,即使 %random% 仅随 1 变化,您也会得到不同的输出:
set /A "rand=(%random% %% n)+1"
【解决方案2】:
cmd 使用的 PRNG 使用当前时间进行初始化,分辨率为一秒,每个cmd 实例一次(此行为已暴露在here)。在同一秒内启动的两个单独的cmd 实例将生成相同的伪随机序列。
但是在同一个cmd 实例中连续执行相同或不同的批处理文件将检索不同的(或不是随机的)“随机”序列。
在第一种情况下,在相同或接近几秒的时间启动单独的实例,您可以获得问题中公开的指示行为,但代码中的算法会增加问题。
如果n 每次执行都相同或相似,并且%random% 返回的值接近上一次执行中返回的值(如您所描述的),那么n*%random% 将返回接近于 1 的结果以前的执行。除以 32768 后,任何差异都将被丢弃,并以相同的选定文件结束。
在这种情况下,最好使用模运算符。作为除法的余数,仅从稍微不同的起始随机值就更容易得到不同的结果
set /a "rand=%random% %% n + 1"