Windows 如何在批处理脚本中使用random?

Windows 如何在批处理脚本中使用random?,windows,random,windows-xp,batch-file,Windows,Random,Windows Xp,Batch File,如何在批处理脚本中使用随机数?%random%提供一个介于0和32767之间的随机数 @echo off & setLocal EnableDelayedExpansion for /L %%a in (1 1 100) do ( echo !random! ) 使用诸如SET/A test=%RANDOM%*100/32768+1之类的表达式,您可以将范围更改为您喜欢的任何值(这里的范围是[1…100],而不是[0…32767])。您可能希望获得多个随机数,并且可能希望能够为每个随

如何在批处理脚本中使用随机数?

%random%
提供一个介于0和32767之间的随机数

@echo off & setLocal EnableDelayedExpansion

for /L %%a in (1 1 100) do (
echo !random!
)

使用诸如
SET/A test=%RANDOM%*100/32768+1
之类的表达式,您可以将范围更改为您喜欢的任何值(这里的范围是[1…100],而不是[0…32767])。

您可能希望获得多个随机数,并且可能希望能够为每个随机数指定不同的范围,因此您应该定义一个函数。在我的示例中,我使用
call:rand2530
生成从25到30的数字。函数退出后,结果将显示在
RAND_NUM

@echo off & setlocal EnableDelayedExpansion

for /L %%a in (1 1 10) do (
        call:rand 25 30
        echo !RAND_NUM!
)

goto:EOF

REM The script ends at the above goto:EOF.  The following are functions.

REM rand()
REM Input: %1 is min, %2 is max.
REM Output: RAND_NUM is set to a random number from min through max.
:rand
SET /A RAND_NUM=%RANDOM% * (%2 - %1 + 1) / 32768 + %1
goto:EOF
%RANDOM%为您提供一个介于0和32767之间的随机数

您可以通过以下方式控制数字的范围:

set /a num=%random% %%100
-将生成0到99之间的数字

这个:

set /a num=%random% %%100 +1
-将产生1到100之间的数字

set /a number=%random% %% [maximum]-[minimum]
“例子”


将给出一个介于100和50之间的随机数。如果不在批处理脚本中使用该行,请确保仅使用一个百分号作为操作数!

您可以这样做,而不需要
启用延迟扩展

@echo off
title Professional Hacker
color 02
:matrix
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%% 
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%% 
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%% 
goto matrix
:choosenamea
cls
set /a choosemname=%random%

if %choosemname% GTR %max% goto choosenameb
if %choosemname% LSS %min% goto choosenameb
goto gotnamenow

其中,
max
是您的最大值,
min
是您的最小值。这不是很有效,因为如果您的范围太小,可能需要很多回合。此外,这对大于32767的数字不起作用。

假设您想要一个数字1-5;您可以使用以下方法:

    :LOOP
    set NUM=%random:~-1,1%
    if %NUM% GTR 5 (
    goto LOOP )
    goto NEXT
或者您可以使用:~1,1代替:~-1,1。不需要:~-1,1,但它可以大大减少达到正确范围所需的时间。假设您想要一个数字1-50,我们需要在2位数和1位数之间进行选择。使用:

    :LOOP
    set RAN1=%random:~-1,1%
    if %RAN1% GTR 5 (
    goto 1 )
    if %RAN1%==5 (
    goto LOOP )
    goto 2

    :1
    set NUM=%random:~-1,1%
    goto NEXT

    :2
    set NUM=%random:~-1,2%
    goto NEXT
您可以在此算法中添加更多内容,以便在较大范围内进行选择,例如1-1000。

@(如果不是“%1”==“max”(start/max cmd/Q/C%0 max&X),则设置C=1和设置D=2&wmic进程,其中name=“cmd.exe”CALL setpriority“REALTIME”>NUL)和CLS
:Y
title%random%6%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%和color%D%%D%%ECHO%random%%C%%random%%random%%(超时/T 1/NOBREAK>nul&set C=1&CLS&IF%D%eq 9(set D=1)其他设置/A D=%D%+1)其他设置/A C=%C%+1)&goto Y

简化为多个IF语句和大量((())现在具有dos彩虹的所有颜色

@(IF not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)
  ELSE set C=1&set D=A&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL)&CLS
:Y
set V=%D%

(IF %V% EQU 10 set V=A) 
    & (IF %V% EQU 11 set V=B)
    & (IF %V% EQU 12 set V=C)
    & (IF %V% EQU 13 set V=D) 
    & (IF %V% EQU 14 set V=E)
    & (IF %V% EQU 15 set V=F)
title %random%6%random%%random%%random%%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%&color %V%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%
&(IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&IF %D% EQU 15 (set D=1)ELSE set /A D=%D%+1)
  ELSE set /A C=%C%+1)&goto Y

完全随机,完全没有秩序:
SET/a V=%random%%%15+1

@(如果不是“%1”==“max”(start/max cmd/Q/C%0 max&X),则设置C=1并设置V=A&wmic进程,其中name=“cmd.exe”调用setpriority“REALTIME”>NUL)和CLS
:Y
(如果%V%eq 10组V=A)和(如果%V%eq 11组V=B)和(如果%V%eq 12组V=C)和(如果%V%eq 13组V=D)和(如果%V%eq 14组V=E)和(如果%V%eq 15组V=F)
title%V%%random%6%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%和ECHO%ran(超时/T 1/NOBREAK>nul&set C=1&CLS&set/A V=%random%%%15+1)其他设置/A C=%C%%+1)&goto Y

对于那些并不总是想要黑屏的人来说,这是完全随机的

@(如果不是“%1”==“max”(start/max cmd/Q/C%0 max&X)否则设置A=0&设置C=1&设置V=A&wmic进程,其中name=“cmd.exe”调用setpriority“REALTIME”>NUL)和CLS
:Y
(如果%A%eq 10集合A=A)和(如果%A%eq 11集合A=B)和(如果%A%eq 12集合A=C)和(如果%A%eq 13集合A=D)和(如果%A%eq 14集合A=E)和(如果%A%eq 15集合A=F)
(如果%V%eq 10组V=A)和(如果%V%eq 11组V=B)和(如果%V%eq 12组V=C)和(如果%V%eq 13组V=D)和(如果%V%eq 14组V=E)和(如果%V%eq 15组V=F)
(如果%A%eq%V%set A=0)
标题%A%%V%%random%6%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%和color%A%%V%%ECHO%%random(超时/T1/NOBREAK>nul&set C=1&CLS&set/A=%random%%%15+1&set/A V=%random%%%15+1)其他set/A C=%C%%+1)&goto Y

这将改变屏幕颜色,而且两者都是随机的。

这是我为您创建的一个示例,它将显示一个对话框,要求您选择一个数字1-10,根据您选择的数字,它将为您命名的批处理文件生成一个随机数示例。如果您选择“1”然后你会得到一个随机的1位数示例。如果你选择“10”,那么你会得到一个随机的10位数示例

@echo off
color f0
set /p "FileName= Enter Filename (Without Extension) : "
echo @echo off >> %FileName%.bat
echo File Created!
pause
cls
:CommandLine
set /p "calc= ~%ComputerName%: Enter a number to recieve the amount of  random digits :"
if %calc%==genrand_help goto GenerateRandomHelp
if %calc%==1 echo echo %%RANDOM:~-1%% >> %FileName%.bat
if %calc%==2 echo echo %%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat 
if %calc%==3 echo echo %%RANDOM:~-1%%%%RANDOM:~-1%%%RANDOM:~-1%% >>  %FileName%.bat
if %calc%==4 echo echo %%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat
if %calc%==5 echo echo %%Random%% >> %FileName%.bat
if %calc%==6 echo echo %%Random%%%%RANDOM:~-1%% >> %FileName%.bat
if %calc%==7 echo echo %%Random%%%%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat 
if %calc%==8 echo echo %%Random%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat
if %calc%==9 echo echo  %%Random%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%% >>  %FileName%.bat
if %calc%==10 echo echo %%Random%%%%Random%% >> %FileName%.bat  
goto CommandLine

如果你将除以某个较大的值,你将一个接一个地得到大量的副本。 您需要做的是取%RANDOM%值的模:

@echo off
REM 
SET maxvalue=10
SET minvalue=1

SETLOCAL 
SET /A tmpRandom=((%RANDOM%)%%(%maxvalue%))+(%minvalue%)
echo "Tmp random: %tmpRandom%"
echo "Random:  %RANDOM%"
ENDLOCAL

为什么要在批处理中具体执行此操作?这里有一个非常有趣的与批处理脚本中的随机数相关的问题值得参考…鉴于特定的问题,您很可能会使用某种循环?那么您确实应该使用延迟扩展,例如通过
SETLOCAL ENABLEDELAYEDEXPANSION
和使用
!RANDOM!
而不是像Eugene posted那样的
%RANDOM%
。更一般的表达式应该是
%RANDOM%*(%maxval%-%minval%+1)/32768+%minval%
;只需先将
minval
maxval
设置为适当的值即可。请参阅给它一些空格,这样它就有了行,比如@echo off。当您可以使用上述一行时,为什么要使用
goto
?其他解决方案可以明确指定范围。代码的优点是什么?请注意这不是均匀分布的!以0~99为例,数字0~67的出现频率将略高于数字68~99,因为32767模100是67,而不是均匀分布所需的0。(这不是神奇的语法,但实际上是
%random%%%100<
@echo off
REM 
SET maxvalue=10
SET minvalue=1

SETLOCAL 
SET /A tmpRandom=((%RANDOM%)%%(%maxvalue%))+(%minvalue%)
echo "Tmp random: %tmpRandom%"
echo "Random:  %RANDOM%"
ENDLOCAL