以下脚本:
@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
返回相同的随机数,因此每次执行都会报告。请您提供一个解决方案,详细说明问题发生的原因。
谢谢
答案 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"