在批處理中使用隨機數字
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)。dom