随机数生成器在批处理文件中不是随机的

时间:2019-05-31 16:18:12

标签: batch-file random cmd

尝试生成随机数并将其用于Windows批处理脚本文件中的变量值。也许我缺少一些非常基本的东西,但是某些东西对我来说不起作用。

使用以下内容创建了名为random_test.bat的批处理文件。

SET rnumber=%random%
echo %random%
pause

连续运行文件三次会产生以下输出:

一个

C:\Users\user\Desktop>SET rnumber=28955

C:\Users\user\Desktop>echo 20160
20160

C:\Users\user\Desktop>pause
Press any key to continue . . .

两个

C:\Users\user\Desktop>SET rnumber=29072

C:\Users\user\Desktop>echo 13887
13887

C:\Users\user\Desktop>pause
Press any key to continue . . .

三个

C:\Users\user\Desktop>SET rnumber=29183

C:\Users\user\Desktop>echo 18885
18885

C:\Users\user\Desktop>pause
Press any key to continue . . .

如您所见,命令echo %random%会不断产生预期的0到32,767之间的相对随机数。

同时不使用%random%设置变量rnumber的值。它会产生不太随机的数字(可能也在0到32,767之间),但是它不是随机的。如果我现在猜的话,它似乎正朝着0到32,767的方向缓慢增长。

为澄清起见,脚本每次执行时都会在第2行产生一个随机数(20160、13887、18885 ...),但是第1行似乎会产生一个随着每次执行批处理文件而不断增加的数字(28955, 29072、29183等在我的多个测试中)。

我已经分别在Windows 7 x64和Windows 2012 R2两台不同的计算机上尝试过,连续运行过这3行脚本多次。

接下来要尝试的事情将是来自完全不同的网络上的计算机,我想知道这是否与域策略,网络,软件有关。

这是怎么回事?

更新:

从同一CMD窗口中依次运行命令时,它可以按预期方式运行,但多次执行同一批处理文件时,则无法正常运行。

  • 脚本echo %random%中的行按预期工作。
  • SET rnumber=%random%行没有。

(多次执行同一脚本时)

2 个答案:

答案 0 :(得分:0)

cmd.exe中的随机数字不适合胆小的人。 %RANDOM%和!RANDOM都不!会带你去那里。

此页面https://ss64.com/nt/syntax-random.html引人入胜。

如果您使用受支持的Windows平台,则PowerShell可以正常工作。

@ECHO OFF
FOR /F %%n IN ('powershell -NoLogo -NoProfile -Command Get-Random') DO (
    SET "RNUM=%%~n"
)
ECHO RNUM is %RNUM%

答案 1 :(得分:0)

提供所有从评论讨论,外部资源和关于我的原始问题的测试中学到的一切。

打开新的CMD窗口时,批处理脚本中的随机数生成器使用以下算法为初始随机数值播种。 (从这里开始-https://devblogs.microsoft.com/oldnewthing/?p=13673

srand((unsigned)time(NULL));

因此,当在同一秒内启动两个(或多个)CMD窗口时,%random%的初始返回是相同的。在具有相同种子和运行时间(一秒)的两个CMD窗口中,随后的%random%返回也相同。

此外,如果因此以彼此之间有一定延迟的方式启动CMD窗口,则每个新CMD窗口中%random%伪变量的首次返回将远离随机性,并且将缓慢增加(0到32767范围)。在我的测试中,每个新窗口的初始种子数量每秒增加3或4。

要了解更多信息并找到解决方法,请点击此处:

还要查看@lit提供的PowerShell解决方法。