尝试生成随机数并将其用于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%
行没有。(多次执行同一脚本时)
答案 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。
要了解更多信息并找到解决方法,请点击此处:
Why does rand() yield the same sequence of numbers on every run?
还要查看@lit提供的PowerShell解决方法。