我试图创建一个批处理文件,以xxxx-xxxx-xxxx-xxxx-xxxx
的格式创建一个序列号 - 也就是说,我想要五个随机生成的四位数字。
不幸的是,%random%
可以返回5位数,3位数,2位数,甚至1位数。有没有办法保证随机数中有四位数?
这是我到目前为止的代码:
@echo off
goto a
:b
echo it's a 5 digits number!
:a
set "x=%random%-%random%-%random%-%random%-%random%"
if %random% gtr 9999 goto b
echo it worked
echo %x%
pause
答案 0 :(得分:1)
使用小公式,您可以将随机值(0到32768)的范围更改为更小的值。通过将该计算作为子程序,您可以轻松地多次调用它。
使用setlocal可以防止污染环境。下面的脚本使用随机序列号填充变量serial
,该序列号由1000到9999之间的5个数字组成。
版本1:
@echo off
setlocal
:: Generate 5 random numbers of 4 digits
call :random code1
call :random code2
call :random code3
call :random code4
call :random code5
:: Combine them and show the output.
set serial=%code1%-%code2%-%code3%-%code4%-%code5%
echo %serial%
pause
:: Clear all variables, except %serial%
endlocal & set serial=%serial%
goto :eof
:random
:: Version 1: Generates a random number between 1000 and 9999
setlocal
set /a nr=%random%*8999/32767+1000
endlocal & set %1=%nr%
goto :eof
版本2:
因为:random是一个很好的独立子程序,如果需要,您可以轻松更改它。例如,如果1000到9999不够好,您可以获得0000到9999的范围,并通过将子例程替换为零来左键填充生成的数字:
:random
:: Version 2: Generates a random number between 0000 and 9999
setlocal
set /a nr=%random%*9999/32767
set nr=0000%nr%
set nr=%nr:~-4%
endlocal & set %1=%nr%
代码细分。
setlocal
启动了一个新的本地环境。环境变量被复制到这个新环境中,但如果更改添加或删除它们,则不会影响此“本地”范围之外的环境变量。另请参阅 endlocal 。::
,rem
用于评论:random
是一个标签。以冒号开头的标识符表示标签。标签可用于程序的控制流程。这个标签之后的代码我称之为子程序。您可以跳转到标签以执行子例程(调用)并从中返回(goto :eof
)以继续正常执行。就像你在调用一个单独的批处理文件一样,只是它嵌入在同一个文件中。call
调用批处理文件或子例程。通过指定标签,您可以跳转到批处理文件的另一部分,但与goto
不同,call
允许您跳回到调用位置。goto :eof
跳转到脚本的末尾。如果使用call
调用标签,则此命令将跳回到调用位置并从那里继续执行。所以它就像从函数中返回。endlocal
结束以startlocal
开头的本地范围。endlocal & set serial=%serial%
。这是一个技巧。本地范围已结束,但在结束之前(通过执行该行),命令解释程序解释整行,扩展变量。这允许您将外部(或全局)范围中的变量设置为在内部范围中创建的值。我基本上使用它来指定子例程的返回值,并从脚本中返回变量serial
。endlocal & set %1=%nr%
。这将设置在调用的第一个参数中指定名称的变量。因此%1
扩展为code1
,code2
等。这样,子例程可以设置任何变量,而无需知道它正在设置哪个变量。set /a
设置变量,但允许使用简单的算术公式(计算)。这样,您可以计算1000到9999(版本1)或0到9999(版本2)之间的值。%nr:~-4%
抓取最后四个字符。如果这对你来说太复杂了,你可以复制公式本身并跳过所有其他的:
版本3:
@echo off
set /a code1=%random%*9999/32767
set code1=0000%code1%
set /a code2=%random%*9999/32767
set code2=0000%code2%
set /a code3=%random%*9999/32767
set code3=0000%code3%
set /a code4=%random%*9999/32767
set code4=0000%code4%
set /a code5=%random%*9999/32767
set code5=0000%code5%
set serial=%code1:~-4%-%code2:~-4%-%code3:~-4%-%code4:~-4%-%code5:~-4%
echo %serial%
pause
版本4:
非常非常简单的版本。
Jahwi建议使用模运算来限制数字,因此使用set /a nr=%random%%%10000
会给出0到9999之间的数字。但是,除法并不是真的。由于你得到一个0到32767之间的随机数,只做这个模运算会导致0到2767之间的数字比2768和9999之间的数字更频繁。
如果这不打扰你,你可以使用这个方法,或者只是简单地截断4位数的值,这基本上具有相同的效果。下面的代码只是截断随机数,并确保它们用零填充,直到4的长度。这大约是它的短,但请记住,这些数字比那些数字更简单和平衡。版本1到3。
@echo off
set code1=0000%random%
set code2=0000%random%
set code3=0000%random%
set code4=0000%random%
set code5=0000%random%
set serial=%code1:~-4%-%code2:~-4%-%code3:~-4%-%code4:~-4%-%code5:~-4%
echo %serial%
pause
答案 1 :(得分:0)
问题是,您没有为随机输出设置限制。 修改后的代码:
@echo off
:a
set /a no1=%random%%%10
set /a no2=%random%%%10
set /a no3=%random%%%10
set /a no4=%random%%%10
set /a no5=%random%%%10
set x=%no1%-%no2%-%no3%-%no4%-%no5%
echo %x%
pause
注意%random %%% 9这告诉批处理程序每个生成的数字不得大于9.即随机数必须始终小于10.