在批处理中使用随机数字

RANDOM 是一个动态环境变量,用于返回一个0~32767 之间的随机整数。当 CMD.exe 捕获到 RANDOM 关键字后,会调用相关函数生成一个基于当前系统时间的随机整数。

在代码中有两种方式使用RANDOM变量:
%random% (一般多使用这种形式)
!random!(开启变量延迟扩展后可以这样使用)
在 Set /a 中不能像普通变量一样(如,set /a a=a+1)直接使用变量名字:正确用法是:set /a a=%RANDOM%+5 或 set /a a=!RANDOM!+5
(1)获取指定范围内的随机整数
要获取[0,m]之间的整数: set /a a=%random% %% (m +1)
要获取[m,n]之间的整数: set /a a= m+%random% %% (m-n +1)
注意:
要对数字进行数学运算,必须使用set /a命令。
余数运算符号在命令窗口中是%,在批处理文件中是%%。
例子1
::生成一个不超过10000的正整数
set /a a=1+%random%%%10000

例子2
::生成一个四位数
set /a a=1000+%random%%%9000
(2)检测随机整数的的重复性

ramdom变量是基于系统时间的随机整数,重复几率很小。但是使用 余数运算(%)后,重复几率会大大提高。例如,生成一个1-10之间的随机数字,到第5个时必然会出现重复。因此,生成多个随机数时可能需要检验是否重复。

例子1
::生成10个不重复的整数。
@echo
:loop
set /a tnum=%random%
if not defined _%tnum% ( set s=%s%_%tnum% & set /a i+=1)
set _%tnum%=%tnum%
if not "%i%" equ "10" goto loop
echo %s%
pause

例子2
::生成5个不重复的l两位数
@echo  off
:loop
set /a tnum=10 +%random%%%90
if not defined _%tnum% ( set s=%s%_%tnum% & set /a i+=1)
set _%tnum%=%tnum%
if not "%i%" equ "5" goto loop
echo %s%
pause
(3) 读取时%random%的预处理。
在复合语句中,每个%random%都被独立扩展,能产生正确的结果。
例子:
echo %random% & echo %random%
在括号对中,每个%random%都被独立扩展,能产生正确的结果。
例子:
if -1 (
echo %random%
echo %random%
)
在For循环主体中若存在多个%random%, 每个%random%都被独立扩展。但是%random%的扩展只进行一次,而且扩展是发生在循环主体被执行之前。所以循环执行时,%random%已经不存在了,而是被一个固定的数字替换了!
例子:
::以下语句会生成10个一样的“随机数”。
for /l %%a in (1,1,5) do echo %random%
要避免出现此问题,请延迟变量的扩展或使用goto循环。
例子:
::使用goto循环生成10个随机数
:loop
set /a a+=1
echo %random%
if not a==5 goto loop

例子:
::使用延迟扩展来生成10个随机数。
setlocal enabledelayedexpansion
for /l %%a in (1,1,5) do echo !random!

转载:http://tieba.baidu.com/p/1395633012

0 条评论