【问题标题】:%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"
    

    【讨论】:

    • 能否请edit 解释一下为什么这个语法回答了这个问题?纯代码答案是 discouraged,因为它们不教授解决方案。
    • 确实,太短了。我已经编辑了我的答案。谢谢。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2015-11-09
      • 2020-01-28
      • 1970-01-01
      • 2020-11-26
      相关资源
      最近更新 更多