转载:在批处理中使用随机数字

在批处理中使用随机数字


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!


思考题:
生成由一个不包含重复数字的6位数(注意首位不能为0)。

转载于:https://my.oschina.net/u/199776/blog/326800

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值